From: Shin-ichro Hara Date: 1998-11-21T23:39:44+09:00 Subject: [ruby-dev:3622] Re: Multiple assignment at yield() 原です。 *a = Y を強制的に a = [Y] としてしまうかどうかという話です。 In message "[ruby-dev:3611] Re: Multiple assignment at yield()" on 98/11/20, Yukihiro Matsumoto writes: | |まつもと ゆきひろです |気になるのは以下の点です. | | * ややモデルが複雑化しているが,それを正当化するメリットが | あるか(「*a = [2]」のメリットは理解できますが) で、その、どのぐらいメリットがあるのかというと、こういうこと です。 メソッドのパラメータは *x で受けることによって完全に自分が何 を受けたかを特定できます。(たとえば、パラメータの数によって 異なる動作をするメソッドが書けます。) def foo(*x); p x; end foo(1) #=> [1] foo([1]) #=> [[1]] foo(1, 2) #=> [1, 2] foo([1, 2]) #=> [[1, 2]] ところが、現在の多重代入由来のブロックパラメータへの代入では これはできません。 例: def y1; yield(1); end def y2; yield([1]); end def y3; yield(1, 2); end def y4; yield([1,2]); end def foo1; y1{ |x| p x }; end def foo2; y2{ |x| p x }; end def foo3; y3{ |x| p x }; end def foo4; y4{ |x| p x }; end def bar1; y1{ |*x| p x }; end def bar2; y2{ |*x| p x }; end def bar3; y3{ |*x| p x }; end def bar4; y4{ |*x| p x }; end foo1 #=> 1 foo2 #=> [1] foo3 #=> [1, 2] foo4 #=> [1, 2] bar1 #=> [1] bar2 #=> [1] bar3 #=> [1, 2] bar4 #=> [1, 2] つまり、|x| で受けても |*x| で受けても yield の引数が何だっ たか区別できないものあるわけです。そこで、多重代入の考え方 を少し変えて、 *x = Y #=> x = [Y] とする事により、 bar1 #=> [1] bar2 #=> [[1]] bar3 #=> [1, 2] bar4 #=> [[1, 2]] と、*x で受けた場合はメソッドと同じように受けることにしてし まえ、というのが私の提案です。 実際にイテレータに不定個のパラメータを渡す事はめったにないこ とでですが、相手に確実に情報を渡す方法がある安心感は大事では ないでしょうか。たぶんこの様にしても以前のスクリプトで誤動作 するものはほとんどないのではないか、とふんでいるのですが。