From: m_seki@... Date: 2003-10-25T10:06:49+09:00 Subject: [ruby-dev:21714] Re: drb Hash#each 咳といいます。 > |yieldの多重代入はrespond_to?で判断されていますか? > > はい。T_ARRAYでなければto_aryがあるかどうかrespond_toでチェッ > クし、なければ1要素の配列にします。 obj.respond_to?(:to_ary)でなくて、rb_respond_to(obj, rb_intern("to_ary")) なんですよね。 DRbObject#respond_to?は、リモートのオブジェクトに回送されるのですが、 rb_respond_to()ではrespond_to?は呼ばれないので、to_aryに反応しないと 思うようです。 どこでごまかそうかなあ。to_aryの有無を持つのかなあ。 うーん。多重代入のトリガってなんでしょうねえ。 Object#to_aryがないのはなぜでしたっけ。 仮にこんな風にしてDRbObjectがrespond_to?()に正しく反応するか 試してみました。 def test_10_yield_undumped @there.xarray2_hash.each do |kv| assert_kind_of(DRbObject, kv) assert(kv.respond_to?(:to_ary)) assert_kind_of(DRbObject, kv.to_ary) k = kv[0] v = kv[1] assert_kind_of(String, k) assert_kind_of(DRbObject, v) end end 一応‥ 手元のdRubyでto_aryを特別に処理して、Arrayを変更するようにしてみました。 to_aryが呼ばれないんでまだ意味ないんですけどね。 def test_10_yield_undumped @there.xarray2_hash.each do |kv| assert_kind_of(DRbObject, kv) assert(kv.respond_to?(:to_ary)) assert_kind_of(Array, kv.to_ary) k = kv[0] v = kv[1] assert_kind_of(String, k) assert_kind_of(DRbObject, v) end end