[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";
    
    【分享本文】
    Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email
    【追蹤新文章】
    Facebook Twitter Plurk