From: matz@... (Yukihiro Matsumoto) Date: 1998-11-17T18:53:55+09:00 Subject: [ruby-dev:3590] Re: Multiple assignment at yield() まつもと ゆきひろです In message "[ruby-dev:3589] Re: Multiple assignment at yield()" on 98/11/17, Shin-ichro Hara writes: |原です。 ||どうなんでしょうねえ.Proc#callでは似たようなことをしていま ||すが.確認ですが,*aの場合にはaの要素が1つの時には,配列では ||なく要素を渡す方が良い,という提案ですよね. | |いやっ、あれっ、そういうことかなあ。*aの場合にはaの要素が1つで |あるか否かにかかわらず、要素を渡すのが普通ではないですか? いやあ,多重代入と仮引数へのバインドを比較すると1つの仮引数 は実は多重代入の a, = *a に相当するわけです.ですから | 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| と |*x| が等価です.これはそういうものです. で,考えられる対応は * yieldに*がついた引数が渡され,その要素が1つだった時を特 別扱いし,その要素だけを渡す * ブロックのパラメータに対する挙動を変更し(あるいは多重代 入の挙動も含めて変更し),xは先頭の要素を(つまり「x,」と 等価),*xは配列として代入するようにする というものが考えられます.他にもあるかも. で,後者は大げさになるので避けたいですねえ. |これについては、こういう案もあるのですが。つまり、 | x = 25 #=> x == 25 | x = 25, 26 #=> x == [25, 26] | x = *[25, 26] #=> x == [25, 26] | |たいしてうれしくないかもしれないですが、ブロックパラメータの値 |の受け渡しと consistent になって、八方丸く収まるというわけ。 いや,文法が悲鳴を上げると言うデメリットがあります.^^;;; まつもと ゆきひろ /:|)