From: shugo@... (MAEDA Shugo) Date: 1998-12-07T20:31:35+09:00 Subject: [ruby-dev:3755] Re: List() 前田です。 >>>>> In [ruby-dev:3744] >>>>> "原" == Shin-ichiro Hara san wrote: >> ところでeach_with_indexについてですが、挙動を変えるなら、 (snip) >> のようにeach_with_indexの定義を変えるような気もするんですが、 >> そんなことはないですか? 原> それはそうなんですけれど、ポイントは each がそのままで、 原> each_with_index, each_with_index2 と2つ作るのではなく、 原> each_with_index はそのままで、クラスの側で2種類の動作に 原> 対応したそれぞれの each の定義の仕方が存在するか、という 原> 事なんです。 each単体で使った時の挙動がそのままで、each_with_indexの動作だけ 変わる、というのが気持ち悪い気がしたんです。 例えば、eachが {"key"=>"val"}.each { |key, val| p key #=> "key" p val #=> "val" } という挙動の時、each_with_indexが、 {"key"=>"val"}.each { |key, val, i| p key #=> "key" p val #=> "val" p i #=> 0 } のような挙動で、 eachが、 {"key"=>"val"}.each { |key, val| p key #=> ["key", "val"] p val #=> nil } のような挙動の時は、 {"key"=>"val"}.each { |key, val, i| p key #=> ["key", "val"] p val #=> 0 p i #=> nil } となる、ということならばわかるんですが。 eachの変更によって(each自体の意味は変えずに)each_with_indexの挙動を 変えるためには、配列とリストがある場合には区別されて、ある場合には 区別されない、ということを利用しなければいけないわけで、ちょっと トリッキーな気がします。 むしろ、こういうことができない仕様(例えばyieldで複数の値を渡す時に 配列を使用できないような仕様)の方がモデル的には自然なのではないで しょうか。 # 互換性の問題があるので、そのような仕様に変更するのは無理だと思いますが:-( -- 前田 修吾 (mailto:shugo@aianet.ne.jp)