From: matz@... (Yukihiro Matsumoto) Date: 2003-01-01T13:08:50+09:00 Subject: [ruby-dev:19271] Re: ruby-1.8.0 / yield(nil)とyield()のちがい まつもと ゆきひろです In message "[ruby-dev:19266] Re: ruby-1.8.0 / yield(nil)とyield()のちがい" on 03/01/01, Tanaka Akira writes: |*a で受けると、 | |> def f; yield; end; f {|*a| test_ok(a, [])} |> def f; yield []; end; f {|*a| test_ok(a, [])} | |> def f; yield nil; end; f {|*a| test_ok(a, [nil])} |> def f; yield [nil]; end; f {|*a| test_ok(a, [nil])} | |> def f; yield 1; end; f {|*a| test_ok(a, [1])} |> def f; yield [1]; end; f {|*a| test_ok(a, [1])} | |のそれぞれが区別できないんでは? これは「しょうがない」としました。これが区別できたことはない し、これからも無理でしょう。というか、これも区別したいと思っ ていろいろ画策しましたが、これを区別することを許すと *a = [] が[[]]になってしまい、互換性からも使い勝手からも望ましくない と思ったので。ですから、完全に値を再現可能な形で受け渡しをす るためには、全部配列で表現する(avalueと呼んでます)しかないと 思います。*aで受けるということはavalueを受け取るという意味で すが、avalueと通常のyieldとの間でのラウンドトリップは成立し ません。 |また、*a で渡すと、 | |> def f; yield [[]]; end; f {|*a| test_ok(a, [[]])} |> def f; yield *[[]]; end; f {|a| test_ok(a, [])} | |というように、 | |> def f; yield [[]]; end; f {|a| test_ok(a, [[]])} | |という期待と異なってしまうのでは? 意味がよくわかりませんでした。 def f; yield *[[]]; end; f {|a| test_ok(a, [[]])} が期待されているということ?