From: Shugo Maeda Date: 2010-06-17T17:05:10+09:00 Subject: [ruby-dev:41641] Re: [Feature:trunk] argument delegation 前田です。 2010年6月17日14:53 Yukihiro Matsumoto : > |argument delegationについてはまだ態度を決めかねているのですが、 > |super(...)が導入されたら、(警告を出すなどの移行ステップを経て) > |括弧なしsuperはsuper()と同じ意味にしてしまってはどうでしょうか。 > > うーん、superがsuper()の意味であってうれしいのは、 > > * ルールが少なくなる > * 無引数superの呼び出しが十分に多い > > のいずれかだと思うのですが、前者は結局はRubyの設計では優先度 > が低い「一貫性」を高めるということなので、この際「うれしい」 > とは評価しません。 強いていえば前者ですが、ルールが少なくなることそのものがうれしい のではなくて、通常のメソッド呼出しだと()を付けなくてもよいのに、 superのときだけ引数がないのに()を付けないといけないのが(見た目 的に)気持ち悪い、という理由です。 > 後者ですが、これが実際的にうれしいのは > > * superを含むメソッドが引数を1個以上受け取り > * superにはひとつも渡さない > > というケースだけで、 私の経験では、initializeをオーバーライドするときにsuper()と書かないと いけなくて気持ち悪いと感じることが結構ありました。 ちなみに標準添付ライブラリにおけるsuper/super()の利用箇所を調べたところ super: 391箇所 super(): 292箇所 という結果でした。意外といい勝負じゃないでしょうか。 > superの使い道のうち多くを含む(と思われる) > > * superを含むメソッドが引数を1個以上受け取り > * superにそのまま渡す > > 場合、これまでsuperだけですんだものをsuper(...)と書かねばなら > ず、ちっともうれしくありません。 5文字の節約が重要になるほどよく使う機能でもないと思うので、 短い記述で済むことよりも、他の機能との類推でsuperの挙動を 推測できることの方が利点が大きいように思います。 ただ、互換性の問題もある(既存のスクリプトは機械的に置換できる んじゃないかと思いますが)ので、それほど強くは主張しません。 > |superではブロック引数への代入が反映されない動作になっていますが、 > |argument delegationではどうなりますか? > | > | def foo(&b) > | b = lambda { puts "lambda in foo" } > | bar(...) > | end > | > |というケースの話ですが。 > > 「superと同じ動作」というのが基本だと思います。本当は、通常 > 引数も代入が反映されないようにしたいのですが、YARVの実装だと > 難しいと聞いたような気がします。 性能上の理由ということで了解しました。 # 個人的には、引数に代入するのは悪いスタイルだと思ってるので、どっちでも # いいんですけど。 -- Shugo Maeda