位元詩人 [Raku] 程式設計教學:陣列 (Array)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

陣列 (array) 是線性的容器 (collections),以數字做為索引。本文介紹 Raku 的陣列和串列。

陣列和串列

在 Raku 程式中,串列 (list) 和陣列 (array) 是兩種型別,前者在建立後就不可變動,後者則可變動;串列是實字 (literal),而陣列是變數。

(1, 2, 3).WHAT === List or die "Wrong type";

my @arr = (1, 2, 3);
@arr.WHAT === Array or die "Wrong type";

建立陣列

用一對小括號 () 建立串列後將其指定到陣列。

my @arr = (1, 2, 3, 4, 5);
@arr[0] == 1 or die "Wrong value";

走訪陣列

使用 for 即可走訪陣列或串列:

for 1, 2, 3, 4, 5 -> $i {
    $i.say;
}

陣列操作

陣列可以動態變動長度,如下例:

my @arr = (1, 2, 3, 4, 5);

# Pop from the rear.
my $popped = @arr.pop;
@arr.elems == 4 or die "Wrong length";
$popped == 5 or die "Wrong value";

# Push into the rear.
@arr.push(99);
@arr.elems == 5 or die "Wrong length";
@arr[4] == 99 or die "Wrong value";

# Shift from the front.
my $shifted = @arr.shift;
@arr.elems == 4 or die "Wrong length";
$shifted == 1 or die "Wrong value";

# Unshift into the front.
@arr.unshift(100);
@arr.elems == 5 or die "Wrong length";
@arr[0] == 100 or die "Wrong value";

# Splice out from arbitrary location.
my @spliced = @arr.splice(1, 3, (20, 30, 40));
@spliced ~~ (2, 3, 4) or die "Wrong array";
@arr ~~ (100, 20, 30, 40, 99) or die "Wrong array";

多維陣列

Raku 支援多維陣列 (multi-dimensional array),而且不像 Perl 5,不需透過參考 (reference) 做為內部的資料結構。如下例:

my @mtx = (1, 2, 3; 4, 5, 6);

@mtx[0;2] == 3 or die "Wrong value";

多維陣列的長度不需等長,如下例:

my @mtx = (1, 2; 3, 4, 5; 6, 7, 8, 9);

@mtx[1;2] == 5 or die "Wrong value";

多維陣列的維度也不限於二維,以下是一個三維陣列:

my @mtx[2;2;2] = (((1, 2), (3, 4)),
                  ((5, 6), (7, 8)));

@mtx[1;1;1] == 8 or die "Wrong value";

清空陣列

若有需要,可以將陣列清空,如下例:

my @arr = (1, 2, 3, 4, 5);
@arr.elems == 5 or die "Wrong length";

@arr = Empty;
@arr.elems == 0 or die "Wrong length";
關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。