原です。 |まつもと ゆきひろです || a = 1, *[]; p a || ||は何ですか?私は 1 だと思うんだけど? | |現状では [1] です。つまり、 ああ、やっぱり。これは田中さんの([ruby-dev:13528]) |(1) ... = arg, *[] の挙動 | |% ruby -e 'a, b = [1, 2], *[]; p [a,b]' |[[1, 2], nil] | |*[] が展開されて消えるとすれば、[1, 2] と表示されるというのが意図する |挙動な気がします。 で指摘した点ですね。そしてまつもとさんが([ruby-dev:13540]) | a = [1,2],*r | |の挙動を考えるときr.length == 0であれば、その意図は | | a = [1,2], | |であると考えられます(文法的には許容してませんが)。つまり、左 |辺において a と a, が区別され単値と多値を区別しているように、 |右辺においても、多値でない単一の配列を表現していると考えた方 |が使いやすいように思うようになりました。 と答えている。 私は a = 1, *[]; p a は 1 でいいと思うんだけどなあ。なぜなら 0個以上のオブジェクトをカンマで区切って並べたものをリストと 言います。最後のオブジェクトには * をつけることができます。 を「リスト」の定義としますよね。そうすると [] の中にリストを 置いた時と、= の右側にリストを置いたときは、違う評価(評価と 言っていいかどうかわからないけど)がされる事になります。同じ にしといた方がシンプルではないかな。 | a = [1,2],*[] | |が | a = [1,2], | |と解釈して | | a = [[1,2]] | |になることから導かれています。で、なぜこれがそうかというと、 |仮に | | r1 = [1,2] | r2 = [] | |として | | a = r1,*r2 | |を評価した場合、 | | a = 1,2 | |という結果が得られたとすると、私の感覚では * のついていない |r1の方が展開されてしまったように感じられるからです。 a = 1,2 ではなくて a = [1,2] が得られると考えては?どちらの方式 でも他との矛盾は無いようですが。 ところで、私の想像していたのは、 = の右辺にはリストが置かれる。リストは評価されると「*オブジェクト」 の展開が起こる。そして展開後、リストは 要素の数が0個ならnilに、 1個ならそのまま、 2個以上だったらArray()で配列に されて一つのオブジェクトになって左辺に渡る。 とい2段階モデルです。更に左辺への代入のプロセスを入れると3段階 モデルと言えます。 これはどうでしょう?