まつもと ゆきひろです

In message "[ruby-dev:21768] Re: drb Hash#each"
    on 03/10/30, m_seki / mva.biglobe.ne.jp <m_seki / mva.biglobe.ne.jp> writes:

|> Proc.call([key, value])でいいんじゃないかとおもうんですが、
|> だめでした?
|
|次のような点ではまっています。
|
|% irb
|>> hash = { :key => :value }
|=> {:key=>:value}
|
|>> hash.each { |kv| p kv }                # assocがkvに渡る
|[:key, :value]
|=> {:key=>:value}
|
|>> hash.each { |k, v| p k; p v }          # key, valueがそれぞれ別れて渡る
|:key                                      # ちょっと不思議。
|:value
|=> {:key=>:value}
|
|>>hash.each { |*arg| p arg[0]; p arg[1] } # *argで受けても別れず、arg[0]に渡る
|[:key, :value]
|nil
|=> {:key=>:value}
|
|んん? |k, v| のときと |*arg| のときで挙動が違います。
|Hash#eachは、[key, value]をyieldするんですよね。
|
|Rubyスクリプトから行なうyield()は次のように振る舞います。
|
|>> def foo; yield([:key, :value]); end
|=> nil
|
|>> foo { |kv| p kv }                     # assoc(??)が返る
|[:key, :value]
|=> nil
|
|>> foo  { |k, v| p k; p v }              # kにだけ渡される
|[:key, :value]
|nil
|=> nil
|
|>> foo { |*arg| p arg[0]; p arg[1] }     # arg[0]にだけ渡る
|[:key, :value]
|nil
|=> nil

なんかバグっぽいですね。両方とも同じ結果になるべきでしょう。

|> rb_yield()は1引数のyield相当です。rb_yield_valuesはaを配列と
|> して、yield *aに相当します。明示的に複数値を渡してるわけです
|> ね。
|
|rb_yield(val)とrb_yield_values(1, val)の効果は同じですか?

そのはずです。少なくともそうしようと思ってます。