From: Shin'ya Adzumi Date: 2002-06-15T03:09:24+09:00 Subject: [ruby-dev:17445] Re: return value from methods of Array's subclass あづみです。 ちょいと思い切りが良すぎました。自分が思っていた他の事も混じって しまって説明不足過ぎました。 matz@ruby-lang.org (Yukihiro Matsumoto) wrote: > |この仕様自体には理解できるので、これとは別のアプローチを考えまし > |た。思い切って互換性は考えてません。 > > えーと、「元のオブジェクト」ってのは「元のオブジェクトと同じ > クラスのインスタンスを返す」って意味ですよね。 意味がごっちゃになっていますね。すみません。 元のオブジェクトを返す -> 元のオブジェクトと同じクラスのインスタンスを返す 元のオブジェクトを置き換える -> 元のオブジェクトの要素を置き換える です。つまりは「現在の Array#collect や Array#select とインター フェースは同じだけど返り値が違うメソッドが欲しい」ということです。 自分なりに意味付けしてその意味にあった名前をつけたらこんな感じに なったのですが、どうでしょう、という内容のつもりでした。 > | * Array#collect は Array を返す > | * Array#collect! は無くす > > なぜ? 今の仕様は * Array#collect は Array を返す * Array#collect! は 元のオブジェクトの要素を置き換える なので、返ってくるオブジェクトのクラスが違う場合があります。 これがどうにも気持ち悪く感じたからです。あと、元のオブジェクト と同じクラスのインスタンスを返すメソッドができたなら、 Array#collect! の存在意義はないと思ったからです。 > | * Array#map は元のオブジェクトを返す > | * Array#map! は元のオブジェクトを置き換える > > なぜmapとcollectの意味を変えたいですか? Array#map が必ず Array を返す事が意味的にしっくりこないかなと 「私が」思ったからです。ネイティブどころか全く英語がダメな私の 感覚なので間違っている可能性は大です。 ただ、現在の仕様を壊してまでというほど積極的には思ってはいない です。きっと反対されるだろうなと思いつつ書いています。 > | * Array#choice は Array を返す > > これは新設ですね。仕様は? > > | * Array#select は元のオブジェクトを返す > > なぜ? > > | * Array#select! は元のオブジェクトを置き換える 上記で map を変えるなら select も変えちゃって良いよねみたいな暴 走が入ってました。思いついたときはこれだ、と思ったのですが、今 読み返すとはっきりしないですね。名前に関しては撤回します。 ちなみに、choice は現在の select と全く同じものを想定してました。 安積伸弥 adzumi@denpa.org