開源技術教學文件網 陣列 (Array)

最後修改日期為 OCT 8, 2017

前言

陣列 (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";
分享本文
Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Yahoo
追蹤本站
Facebook Facebook Twitter