前言
陣列 (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";