From: Yukihiro Matsumoto Date: 2010-06-17T15:15:27+09:00 Subject: [ruby-dev:41637] Re: [Feature:trunk] argument delegation まつもと ゆきひろです In message "Re: [ruby-dev:41631] Re: [Feature:trunk] argument delegation" on Thu, 17 Jun 2010 12:05:22 +0900, Tanaka Akira writes: |そういう流れで今回のを見ると、あり得る方向だと思うわけですが、 |2つ懸念があります。 | |今は普通の引数とブロック引数のふたつしかないので、 |ひとつを変えるなら、残りはひとつしかありません。 |したがって、残りすべてを引き渡すのはひとつ書けば済みます。 | |しかし、キーワード引数が入るとみっつになるので、 |ひとつを変えるなら、残りはふたつになります。 |残りすべてを引き渡すのにふたつ書く必要が出てきます。 |おそらくこれはうれしくないでしょう。 「ひとつを変える」という意味がいまいち読み取れなかったのです が、これはたとえば、「通常の引数の前にひとつ別の引数を加える」 とか、「通常引数は同じだが、渡すブロックだけ変える」とかそう いう意味なんでしょうか。 だとすると、おっしゃることは理解できます。ただし、いまのとこ ろキーワード引数は通常の引数の一部として扱おうと思っているの で、あまり問題にはならないかもしれません。 |もうひとつは define_method や lambda との関連です。 | |... という構文には名前が入っていないので、 | |def f(a) | lambda {|b| | g(...) | } |end | |としたときに ... はどの引数を指すのか不明です。 確かに。ただし、「一番内側の引数」とか「lambdaは無視、メソッ ドの引数」でもどちらでもあまり問題ないような気もします。とい うのも、この記法は、できないことをできるようにするものではな くて、めんどくさいものをより楽に表現しようというものですから、 仕様の複雑化を避けてある程度で「あきらめる」というのは十分あ りえる判断だと思います。 |仕様としてどちらかに固定することはできるでしょうが、 |プログラマが選べるような構文にはなっていません。 | |そのうち、選べるようにする構文が要求されるようになるんじゃないでしょうか。 そのような仕様のひとつの案としては、「...」そのものを式として しまって、その値を[ruby-talk:162561]で示されたようなオブジェ クトにする方法がありますね。その場合には「**」と「**obj」の方 が良いかもしれませんが。 つまり、 def f(a) c = ** lambda {|b| g(**c) # aを渡す } end def f(a) lambda {|b| g(**) # bを渡す } end ということですね。ただ、over specな印象があります。 まつもと ゆきひろ /:|)