[Raku] 如何對陣列內容進行同樣的運算

作者:   發佈於:   #rakulang

比方說有一個整數陣列 @nums,而我們要對其中每一個每一個元素都做同樣的操作,以下有幾種簡單的寫法。

超算符

若是一個運算符就可描述出來的運算,可利用超算符。比方說將每個數字都加三,可以這麼寫:

my @bigger-nums = @nums >>+>> 3;

稍微複雜一點的四則運算其實也可以直接串接下去。比方說要將 @nums 中的個數值 $n 都換成 4 * $n + 2

my @new-nums = @nums >>*>> 4 >>+>> 2;

但如果一連串接得很長,或許會變成不那麼容易閱讀,此時或許換成 map 來寫可能會比較好讀。

map

4 *$n + 2 為例是這樣這麼寫

my @new-nums = @nums.map(-> $n { 4 * $n + 2 });

map 來寫的另一個好處是,如果要進行的操作本身已經是一個函式了,那麼可以直接提供函式的 參照就好,不必再把函式內容抄寫一遍。

sub bigger (Int $n) {
    return 4 * $n + 2;
}

my @new-nums = @nums.map(&bigger);

for 迴圈

如果是要將 @nums 就地更新,那麼使用迴圈來寫,也是一個選項。在迭代變數 $n 加上 is rw 後,對 $n 所做的更新就會直接反應回陣列裡面:

for @nums -> $n is rw {
    $n = 4 *$n + 2
}