[Raku] 如何對陣列內容進行同樣的運算
作者:gugod 發佈於: #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
}