From: matz@... (Yukihiro Matsumoto) Date: 2001-06-11T07:41:32+09:00 Subject: [ruby-dev:13540] Re: yield *[[]] まつもと ゆきひろです In message "[ruby-dev:13528] Re: yield *[[]]" on 01/06/09, Tanaka Akira writes: |(1) ... = arg, *[] の挙動 | |% ruby -e 'a, b = [1, 2], *[]; p [a,b]' |[[1, 2], nil] | |*[] が展開されて消えるとすれば、[1, 2] と表示されるというのが意図する |挙動な気がします。 「う、そうかも」と思って考えてみたんですが、 a = [1,2],*r の挙動を考えるときr.length == 0であれば、その意図は a = [1,2], であると考えられます(文法的には許容してませんが)。つまり、左 辺において a と a, が区別され単値と多値を区別しているように、 右辺においても、多値でない単一の配列を表現していると考えた方 が使いやすいように思うようになりました。 右辺における trailing comma を許すようにするかどうかについて はもう少し考えさせてください。 |(2) ... = ..., *non-array の挙動 | |% ruby -e 'a, b = 1, *2' |-e:1: failed to convert Fixnum into Array (TypeError) | |* が右辺先頭にある場合には例外が起きないので一貫性に欠けると感じます。 |そもそも「配列への変換」というのはどのようにして行なわれるのでしょうか? 本来、Array()を用いて行われるべきです。Array()の挙動は、 * 配列であればそのまま * to_aryがあればその結果 * でなければ [ val ] を返します。*が右辺末尾にある場合にもArray()を呼ぶように修正 します。 |(3) 自己代入の右辺で複数の式が扱えてもいい気がする. | | % ruby -e 'a = [1]; a += 2, 3; p a' | -e:1: parse error | |もはや多重代入の右辺はなんらかの(ひとつの)値を生成するための形式なので、 |自己代入の右辺に使えない理由はないと思います。 理論的に使えない理由はないですが、 * 使って嬉しい局面が少ない(a += [2,3]の方が明確) * 文法がより複雑になる ので採用しないかなあと思います。 |(4) Proc との関連性 | | self[arg ...] | call(arg ... ) | 手続きオブジェクトを実行します.引数はブロックの引数にそのまま | (多重代入のルールに従い)代入されます. | |というマニュアルの記述はもはや明らかに正しくありません。 正しくありません。1.0の頃は正しかったと思いますが。 この辺も(マニュアルの表現と実際の挙動の両方で)見直しが必要そ うな気がします。 |さて、現在の挙動をちゃんと理解できたかどうかを確認するために、私が理解 |しているところの挙動を(マニュアル風に)書き下してみました。この理解は正 |しいでしょうか? (左辺の記述が甘いのは承知していますが。) 今ちょっと時間が乏しいので後で見てみます。 まつもと ゆきひろ /:|)