From: Shugo Maeda Date: 2001-06-08T14:00:29+09:00 Subject: [ruby-dev:13497] Re: yield *[[]] 前田です。 At Thu, 7 Jun 2001 20:45:01 +0900, Tanaka Akira wrote: > 興味のある人は > http://www.ruby-lang.org/cgi-bin/ruby-bugs-ja/incoming?id=53;user=guest > を眺めて、望ましい仕様がどんなものか議論していただけるとありがたいので > すが。 Followup10で指摘されている状況と、CVSのHEADで試した結果が異なるの ですが、変更されました? > まつもとさん $ ruby17 -v ruby 1.7.1 (2001-06-07) [i686-cygwin] $ ruby17 -e 'a, = *[[]]; p a' [] $ ruby17 -e 'a, = [*[[]]]; p a' [] $ ruby17 -e 'def f; yield *[[]]; end; f {|a,| p a}' nil $ ruby17 -e 'def f; yield [*[[]]]; end; f {|a,| p a}' nil $ ruby17 -e 'a,b,c,d = *[[1,2,3,4]]; p [a,b,c,d]' [[1, 2, 3, 4], nil, nil, nil] $ ruby17 -e 'a,b,c,d = [*[[1,2,3,4]]]; p [a,b,c,d]' [[1, 2, 3, 4], nil, nil, nil] $ ruby17 -e 'def f; yield *[[1,2,3,4]]; end; f {|a,b,c,d| p [a,b,c,d]}' [1, 2, 3, 4] $ ruby17 -e 'def f; yield [*[[1,2,3,4]]]; end; f {|a,b,c,d| p [a,b,c,d]}' [1, 2, 3, 4] 現状では、 ... = *r と ... = [*r] の結果は同じようになっているようですが、左辺がただの変数(a)か多重 代入の左辺(*aやa,b)かどうかで結果が異なっていて、 > | (2) = (1) > | > |と等価な > | > | (3) = (1) > | (2) = (4) > | > |というもの作れるか。それも (3) と (4) は (1) と (2) の形に依存しない形 > |で固定したものである必要がある。 > | > |... うぅむ。どうやら (3) と (4) をただの変数にすればいいようです。(1) > |と (2) に両方 , ないしは * が入っていて両方が多重代入になっている時が > |少し不安ですが。 > > 確認してみました。現状の1.7.1では問題が残っていましたが、 > (3),(4)を共通の「ただの変数」にすることにより達成できるよう > にします。 というのは (1) => *配列の配列 (2) => *aやa, というケースで成り立っていないようです。 例: (1)が*[[1,2,3]]、(2)が*aの場合 $ ruby17 -e '*a = *[[1,2,3]]; p a' [[1, 2, 3]] $ ruby17 -e 'x = *[[1,2,3]]; *a = x; p a' [1, 2, 3] というわけで、上記のような趣旨だとすると、仕様に問題があるのでは ないでしょうか。 -- 前田 修吾