From: Tanaka Akira Date: 2010-06-17T12:05:22+09:00 Subject: [ruby-dev:41631] Re: [Feature:trunk] argument delegation 2010年6月17日6:31 Yukihiro Matsumoto : > |(1) ブロックを引き継がせたいだけ (引数は変えたい) ときに不便 > (1) については、ブロックを引き継がせたい時には、明示的にブロッ > クを引き渡せばよい(ひとつのことをしたいときに、ひとつのこ > とをすればよい。冗長性はない)ので、手当ての必要があるか > どうか疑問です。今回の動機は「ひとつのことをするのに、ふ > たつのことを書かないといけない」という冗長性ですから。 今回の話にはなぜか触れられていないんですが、 この機能の背景のひとつにはキーワード引数があるように思えます。 キーワード引数を加えたときに、キーワード引数が 普通の引数でもブロック引数でもないものとすると、 すべての引数を引き渡すのに 3つそれぞれについて引き渡さないといけません。 それを避けるためにキーワード引数を普通の引数の一部にするということにしたら、 反論が出まくって仕様がまとまらなかった、というのが私の認識です。 [ruby-talk:162431] それならすべての引数を引き渡すための機能をつける、というアイデアを [ruby-talk:162561] や [ruby-dev:30892] に書いたことがありますが、 その時点では反応を得られませんでした。 そういう流れで今回のを見ると、あり得る方向だと思うわけですが、 2つ懸念があります。 今は普通の引数とブロック引数のふたつしかないので、 ひとつを変えるなら、残りはひとつしかありません。 したがって、残りすべてを引き渡すのはひとつ書けば済みます。 しかし、キーワード引数が入るとみっつになるので、 ひとつを変えるなら、残りはふたつになります。 残りすべてを引き渡すのにふたつ書く必要が出てきます。 おそらくこれはうれしくないでしょう。 つまり、argument delegation はキーワード引数を入れるときに困る問題を解決する かもしれないと思ったら、実際のところはあまり解決していない、というわけです。 > |(3) define_method でサポートできていない (将来的にされる予定はある?) > (3) 将来的には、define_methodでもサポートされるべきだと思いま > す。できてないのは実装上の制約だと思ってください。 もうひとつは define_method や lambda との関連です。 ... という構文には名前が入っていないので、 def f(a) lambda {|b| g(...) } end としたときに ... はどの引数を指すのか不明です。 仕様としてどちらかに固定することはできるでしょうが、 プログラマが選べるような構文にはなっていません。 そのうち、選べるようにする構文が要求されるようになるんじゃないでしょうか。 -- [田中 哲][たなか あきら][Tanaka Akira]