まつもと ゆきひろです
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で良いじゃんというのはありますね。
まつもと ゆきひろ /:|)