4. 関数とミューテータ

関数とミューテータの違いを知るのは大事なことです。
関数は対象の状態を変更しません。
ミューテータは対象の状態を変更します。

スクリプト
1 2 3 4 5 6 7 8 9 10
my @numbers = [7,2,4,9,11,3]; @numbers.push(99); say @numbers; #1 say @numbers.sort; #2 say @numbers; #3 @numbers.=sort; say @numbers; #4
出力
[7 2 4 9 11 3 99] #1
(2 3 4 7 9 11 99) #2
[7 2 4 9 11 3 99] #3
[2 3 4 7 9 11 99] #4
解説

.push はミューテータです。配列の状態が変更されています(#1)。

.sort は関数です。ソートされた配列を返していますが、元の配列の状態は変更されていません:

  • (#2) でソートされた配列を返していますが、

  • (#3) を見ると元の配列は変更されていないことが分かります。

関数をミューテータのように振る舞わせるには、 . の代わりに .= を使います。(#4) (スクリプトの9行目)