From: Shin-ichro Hara Date: 1998-11-17T18:43:15+09:00 Subject: [ruby-dev:3589] Re: Multiple assignment at yield() 原です。 In message "[ruby-dev:3588] Re: Multiple assignment at yield()" on 98/11/17, Yukihiro Matsumoto writes: |まつもと ゆきひろです |どうなんでしょうねえ.Proc#callでは似たようなことをしていま |すが.確認ですが,*aの場合にはaの要素が1つの時には,配列では |なく要素を渡す方が良い,という提案ですよね. いやっ、あれっ、そういうことかなあ。*aの場合にはaの要素が1つで あるか否かにかかわらず、要素を渡すのが普通ではないですか? def yield0(x); p x; end def bar(a) yield0(*a) end bar([3]) #=> 3 それが、今回はそうなってないわけです。 def foo(a) yield(*a) end foo([3]) { |x| p x } #=> [3] ここでブロックパラメータ x は、渡された値が1つなので、 渡されたものがそのまま入っているはずですよね。 |ま,ルールはやや複雑になりますが,その方が自然だというなら |(別の場所で類似のことをしていることもあるし),反対するつもり |はそれほどないのですが. というわけでルールは単純になると思うのだけど。 || foo = 1, 2, 3 || foo = *[1, 2, 3] || ||が parse error になるけど、これはそういうものなんでしたっけ? ||そういうものなんでしょうね。 | |そういうものです.右辺のコンマは多重代入の機能ですが,上の例 |の左辺はいずれも単純代入ですよね.ここで単純代入の右辺にもコ |ンマ式を許すという考え方もありますが,文法がかなり複雑化する |のでできれば避けたいです. これについては、こういう案もあるのですが。つまり、 bar = Proc.new { |x| p x } bar.call(25) #=> 25 bar.call(25, 26)#=> [25,26] をまねて、 x = 25 #=> x == 25 x = 25, 26 #=> x == [25, 26] x = *[25, 26] #=> x == [25, 26] たいしてうれしくないかもしれないですが、ブロックパラメータの値 の受け渡しと consistent になって、八方丸く収まるというわけ。