06/12/26 09:50:48
Ruby では、ブロック引数に値を渡すときの操作は実質的には(多重)代入と同じ。
|s, a| と書くのは、 |s, a| = each_elementのように値が入るのと等価になっている。
また、
a, *b = [1, 2, 3]
とすればaに1、bに[2,3]が入るという規則を思い出すと、今回のケースでは、
「多重代入で最初のものだけを得たい」というケースであるから、
|s, *dummy| と書けば s に最初の要素が、 dummy に残りの配列が手に入る
ことになる。
でも今回は dummy は使わないから省きたい。で、こういう要求にこたえて最
近のRubyでは*パートの変数名を省略できるようになっている。つまり、
a, * = [1, 2, 3]
と書くと a に1が入るという操作になる。
というわけで、ブロック引数に |s, *| と書くと、 s に最初の要素が入ることになる。
ちなみに ,* が省かれるとふつうの代入と区別できないため、sには配列が入る。
……なんだけど実際には * はなくても良いのを思い出した。
カンマがあれば良いので |s,| で良かったです。すまん。