まつもと ゆきひろです

In message "[ruby-list:20885] Re: collect + find_all ==> select ?"
    on 00/02/21, "H.TAKEI" <takei.hideaki / lab.ntt.co.jp> writes:

|> |  ブロックはとりませんが,each で実現できる(と思います)し,
|> |  Enumerableにあっていい気がします。
|> 
|> Array#compactは「nilでない要素を集めるメソッド」ではなく、
|> 「配列からnilを取り除くメソッド」だからです。前者なら each
|> で実装できますから、Enumerableに入る余地はあると思います。
|> # 名前が決まれば。
|
|う〜,素人感覚だと,両者の機能は同じな気がするので,
|(より汎用性のある)Enumerableに前者の機能を実装し,
|その名前をcompactにしてよい気がしてしまいます。

えーと、本質的には同じと言っても良いのかも知れませんが「配列
からnilを取り除くメソッド」では元の配列の内容が変わってしま
います。また、compactは受け手を変化させる動詞のように私に感
じられたってのはあると思います。collectが受け手を変化させる
動詞には感じられないので collect! がないのとちょうど反対です
ね。

|『変更はより慎重であるべき』ということですか?

それもあります。

仮にcompactが「受け手を変化させるのではなく、nil以外の要素を
集める」という意味として解釈できると、私の考えが変わったとし
ても、だからといってEnumerableにcompactを追加すると、元々あっ
たArrayクラスのcompactメソッドの意味が変化してしまいます。互
換性からもこれは避けたいです。

というわけで、Enumerableクラスに「nil以外の要素を集める」と
いうメソッドを追加することに反対ではないです。しかし、その名
前はcompactであるべきではないということですね。

|> |★ "集合"をあつかうクラスはないのでしょうか?
|> |
|> |  私が collect.compact を使う用途の半分は集合データに対するものでした。
|> 
|> 私は大体は配列で済ましてしまいます。& とか | とかはその辺を
|> 意識したメソッドです。足りないメソッドがあれば追加しても良い
|> とは思います。
|
|なるほどです。
|
|必要ありそうな候補は,
|
|・集合として同じか?
|・部分集合か?
|
|ぐらいが思いつきます。

ふむ。それってどういう定義が望ましいですか?

ちょっと考えると任意の要素の集合として考えるとき、要素につい
ての前提をなにも使えなければ、全ての組合せで比較するしかない
ように感じられますが。また、比較の基準はなににしましょう。
==? ===? equal?

要素がComparableであればあらかじめsortするという手が使えます
けどねえ。

|話題ちょっと変わりますが,もう一度定義をみますと,
|Enumerableって直接Arrayを返すのですね。
|
|Enumerable の定義として,
|
|・入力はコンテナのeach
|・出力はコンテナのpush
|・(新しい空のコンテナを作るメソッド)
|
|のようにして Enumerable を Array から独立させる
|とかいうのはなかったでしょうか?

思い付きませんでした。;-)

全てのコンテナがpushを持つわけではないということと、入力のコ
ンテナと出力のコンテナは独立なものなわけですが、別々に指定す
るのは結構面倒な気がするのと、RubyはArrayが十分強力なので出
力はArrayで良いじゃんというのはありますね。

                                まつもと ゆきひろ /:|)