咳といいます。
1.6.8のときのノウハウとか思い出してきました。
1.7系で追加されたProc#yieldを使おうとしてはまってしまったようです。> 咳
1.6.8ではyieldを真似するために [argv].collect(&obj)[0] を使ってました。
次のようにすることでRuby相当の挙動をさせています。
(__drb_yieldがyield相当です。)
def obj_send(obj, msg_id, *argv)
if Proc === obj && msg_id == :__drb_yield
if argv.size == 1
ary = argv
else
ary = [argv]
end
if false # FIXME
ary.collect(&obj)[0]
else
it = ary.collect(&obj)
raise(LocalJumpError, 'break from proc-closure') if it.nil?
it[0]
end
else
obj.__send__(msg_id, *argv)
end
end
今日のまつもとさんの変更で1.6.8と同様にすることで動きそうです。> まつもとさん感謝
でも新たな問題がでちゃいました。そっちは別メールにします。
*argでうけてyield(*arg)するのであれば、田中さんが指摘されている
ケースの仕様が変わらないとだめそうですね。
# 以前気付いてメモしておいたのを忘れてました。すみません。
> とするのと、[ruby-dev:19231] で推奨されている、いったん |*a| で受けて
> yield *a で渡すというのに対応する
>
>> |> def f; yield [[]]; end; f {|*a| test_ok(a, [[]])}
>> |> def f; yield *[[]]; end; f {|a| test_ok(a, [])}
>
> というので結果が異なるのは wrapper になってないからまずいだろう、とい
> うことです。
>
> つまりこれも |*a| で受けて yield *a とするのがいいだろうという話に対す
> る反例の提示です。