From: Shin-ichiro Hara Date: 1998-12-17T01:43:52+09:00 Subject: [ruby-dev:3841] Re: List() 原です。 > 前田です。 > ほんとはString#scanのようなメソッドも一応すべてListを使うように > 変更した方がよいと思うのですが。 ほんとはそうですね。でも変更してもしなくてもユーザーにはほとんど 関係ないでしょうね。scan(...) { |*x| ... と使っていた人はほとん どいないでしょうから。でもほんとは List を使うべきです。 > いや、each_with_indexの挙動を変えるかどうかは別の議論が必要だと > 思うのですが、ユーザが なるほど、Hash#each は yield(k, v) に変えて each_with_index はそのままなわけですね。あれ、それでいいではないですか。なぜ私 はそれに気づかなかったのだろう。この方法なら非互換性はかなり少 なくなります。 > # ひょっとしたら僕の主張がeach_with_indexの挙動を変えるべきだと受け > # 取られていたために議論がすれちがっていたのでしょうか。 それもあります。しかし、each_with_index は変えるべきだと思い込 んでいた自分自身が理解不能です。 、、、と思ったんだけど、思い出しました。風が吹くと桶屋がもうかる式論理 ですが説明します。 List 方式を導入したら Enumerable の多くのメソッドを書き換えたく なる。なぜなら現在はたとえば collect は (あ) def collect ary = [] each { |x| ary.push yield(x) } ary end という定義ですが、List 方式が導入されたらやはり (い) def collect ary = [] each { |*x| ary.push yield(*x) } ary end と書き換えたくなってしまう。なぜなならこっちのほうがずっときれいだ (与えられた物をそのまま渡している)から。しかもこう変えることによ って組み込みクラスに対する collect の動作は(ほとんど)変わらない というのも(い)にしたくなる理由です。 さらに collect がこうなるなら each_with_index も (う) def each_with_index i = 0 each { |x| yield(x, i) #or yield([x, i]) i += 1 } end から (え) def each_with_index i = 0 each { |*x| yield(*(x + i)) i += 1 } end に書き換えたくなるのが人情:-)というもの。ただし(え)の場合は Hash#each が yield([k, v]) のままならいいが、yield(k, v) と すると(それが本来の姿ではあるが)非互換になってしまう。よって yield([k, v]) 方式のままにしておこうか。 、、、という論理だったのです。 話を戻すと、Enumerable のメソッドの定義はそのままで Hash#each は 変える。その方式はありえると思います。気に入らなければユーザーが 再定義すればいいですから。 > 今日、結局穴だらけのままで提出してきました(^^; おめでとうございます。ruby をいじる時間が減ったりして。:-)