咳といいます。

1.8.1 previewまでに直したかったなあ。

> In message "[ruby-dev:21745] Re: drb Hash#each"
>     on 03/10/29, m_seki / mva.biglobe.ne.jp <m_seki / mva.biglobe.ne.jp> writes:
> 
> |dRubyではHashの要素がDRbUndumpedでなくとも、eachが
> |うまくいかないようです。
> 
> どううまく往きませんか? (バグかも)
> 
> |Hash#eachなどをProc#callで再現するには、どうしたらいいんでしたっけ?
> 
> 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_hash_each()とeach_i()では、次のようなことをしてますよね。
> |
> |  assoc = Array.new(:key, :value)
> |  yield(assoc)
> |
> |rb_yield()とrb_yield_values()ってなにが違うかというと、
> |rb_yield_0()の引数avalueが違うのかな。avalueがなにか影響するのかしら。
> 
> rb_yield()は1引数のyield相当です。rb_yield_valuesはaを配列と
> して、yield *aに相当します。明示的に複数値を渡してるわけです
> ね。

rb_yield(val)とrb_yield_values(1, val)の効果は同じですか?

rb_yield()は
    return rb_yield_0(val, 0, 0, Qfalse, Qfalse);
と実装されるのに、

rb_yield_values()は
    return rb_yield_0(ary, 0, 0, Qfalse, Qtrue);
と実装されている点が影響しているのかなあ、と想像してます。

hash_i()は
    rb_yield(rb_assoc_new(key, value));
ですが、
    rb_yield_values(1, rb_assoc_new(key, value));
と同じでしょうか?