From: Shin-ichro Hara Date: 1998-11-20T15:15:28+09:00 Subject: [ruby-dev:3608] Re: Multiple assignment at yield() 原です。 In message "[ruby-dev:3601] Re: Multiple assignment at yield()" on 98/11/20, Yukihiro Matsumoto writes: | |まつもと ゆきひろです |ということですから 7 の方が良いですね.そうか. |それを加味すると結果は | | Foo.new([0]).each0 { |x| p x } #=> 0 | Foo.new([1]).each1 { |x| p x } #=> 1 | Foo.new([2]).each2 { |x| p x } #=> [2] | Foo.new([3]).each3 { |x| p x } #=> 3 | Foo.new([4]).each4 { |x| p x } #=> 4 | Foo.new([5]).each5 { |x| p x } #=> 5 | Foo.new([6]).each6 { |x| p x } #=> [6] | Foo.new([7]).each7 { |x| p x } #=> 7 | Foo.new([8]).each8 { |x| p x } #=> 8 | | Foo.new([[0]]).each0 { |x| p x } #=> [0] | Foo.new([[1]]).each1 { |x| p x } #=> 1 | Foo.new([[2]]).each2 { |x| p x } #=> [2] | Foo.new([[3]]).each3 { |x| p x } #=> 3 | Foo.new([[4]]).each4 { |x| p x } #=> [4] | Foo.new([[5]]).each5 { |x| p x } #=> 5 | Foo.new([[6]]).each6 { |x| p x } #=> [6] | Foo.new([[7]]).each7 { |x| p x } #=> 7 | Foo.new([[8]]).each8 { |x| p x } #=> [8] | |になりますね. この結果は納得できます!これを仕様にするのはいいとおもいます。 残る問題は *a = [0] ですね。 || 1) yield(*x) は無条件に x の一番外側の [] を剥ぎとって || 代入の右辺に置く || 2) *x = は無条件に右辺に [] を付けて受ける || 3) それ以外はいままで通り || ||というものです。したがって、、、 | |こっちはいまいち受け入れがたく感じています.というのも | | (1) yieldの元々の挙動が「1要素はそのまま,2要素以降は配列 | 化して渡す」というものですから.が,each7で分かったよ | うに,*がつけばプログラムの字面上その配列の(配列でなけ | れば配列化した)内容が展開された時と同じ動作をするよう | にしようと思います. | | (2) *xというのは「右辺の残りを代入する」という意味です.多 | 重代入ですから,右辺は配列化されます.ですから,右辺に | コンマが無く,その値が配列でないものが来た時には [] を | つけて受けることになります(現状の動作). | | これを「無条件に [] をつける」となると,「右辺が配列で | ない時には配列化する」という多重代入の原則が崩れるよう | に思えるのですが,違うのでしょうか? その通りです。原則を崩さないとできないんです。で、その「良い崩 し方」を考えています。 |というのを読むと分かって来ました.そうか. | | a, *b = 1, [3]; # a=1, b=[[3]] | |なのに | | *b = [3]; # b=[3] | |なのはおかしいということですね.それは確かに. そうです。まさにそれを問題にしていました。 In message "[ruby-dev:3604] Re: Multiple assignment at yield()" on 98/11/20, Yukihiro Matsumoto writes: |と思ったのですが,考え直してみると,前者の右辺の値は | | [1, [3]] | |で,後者の右辺の値は | | [3] | |ですから,これで良いようにも思えて来ました.少々混乱を呼びが |ちですが.まったく新しい解釈が出ない限り現状のままにした方が |良いように思います.原さんの案に期待しよう. そうなんです。混乱するけど、これは理屈は通ってるんです。 しかし、多重代入を介して、b に Y を確実に渡すには、 dummy, *b = "dummy", Y みたいに書かざるをえない。それが残念な気がするのです。 で、私の考えは、、、また後で。 ||話を yield の方に移して、現在の yield(Y) のパラメータの渡し方は ||こうですよね。 || || |x| #=> x = nil [ Y が0要素のとき ] || = Y [ x = Y が単純代入の形をしているとき ] || = A(Y) [ それ以外 ] ||ここまではいいでしょうか?合ってますか? | |おおむね合ってます.些細な補足は Y がコンマで区切られた式だっ |た場合,無条件に[Y]と解釈されることです. それは || = A(Y) [ それ以外 ] に含めたつもりでした。大文字で X とか Y とか書いたらコンマで 書いたリストもあり得ることにしましょう。