From: matz@... (Yukihiro Matsumoto) Date: 2003-01-01T20:32:13+09:00 Subject: [ruby-dev:19276] Re: ruby-1.8.0 / yield(nil)とyield()のちがい まつもと ゆきひろです In message "[ruby-dev:19272] Re: ruby-1.8.0 / yield(nil)とyield()のちがい" on 03/01/01, Tanaka Akira writes: |> これは「しょうがない」としました。これが区別できたことはない | |互換性との兼ね合いで困難なのであろうことはわかります。 | |したがって、wrapper に |*a| を使うのは無謀なのだろう、というのが私の印 |象です。そして、だからこそ、wrapper を作るときには |a| で受けるしかな |いんじゃないのか、というのが私の立場です。 うーん、そうなのかなあ。 |今回の話は、drb のような yield を転送する wrapper ですから、 | |server: def f() yield [[]] end |client: f {|a| ... } | |とあった場合に、直接 | |> |> def f; yield [[]]; end; f {|a| test_ok(a, [[]])} | |とするのと、[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 とするのがいいだろうという話に対す |る反例の提示です。 やっとわかりました。そうすると、やはり*aで受けて*aで渡すとい うのは不適切なのかなあ。でも、今度はyield nilとyieldの区別が つかないしなあ(区別する必要はないような気もしますが)。 |> *a = [] |> |> が[[]]になってしまい、互換性からも使い勝手からも望ましくない |> と思ったので。 | |ただ、互換性を考えなければ、個人的に想像する使い勝手としては、これが |[[]] になるのは構わないと思います。 こうすると、その延長線上として *a = [1,2] が[[1,2]]となることとなり、結果として「配列でエミュレートさ れている多値戻り値」が使えなくなると思います。ちゃんとした多 値を導入するとかいう話もありえないではないですが。 まつもと ゆきひろ /:|)