咳といいます。 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)); と同じでしょうか?