コードレビューの中で以下のようなコード(あくまでサンプル)を見つけました。
ruby
1class HistoryCollection 2 def initialize(array) 3 @array = array 4 end 5 6 def select_by_name(name) 7 arr = @array.select { |history| history.name == name } 8 HistoryCollection.new(arr) 9 end 10end
ここで、一度selectメソッドで絞った後に、同じCollectionとして返すためにHistoryCollection.newをするのを見て、自分は「気持ち悪いな」と思いました。
なので、これを無くせないかコードをいじろうとしてみました。
そこで、パッと思いついたのが、Enumerableをincludeすればいけるかなと思ったのですが
想定と違っていましたので少し見てください。
ruby
1class HistoryCollection 2 include Enumerable 3 4 delegate :each, to: :@array 5 6 def initialize(array) 7 @array = array 8 end 9 10 def select_by_name(name) 11 select { |history| history.name == name } 12 end 13end
実際やってみるとこの時のselect_by_nameの返り値はArrayクラス。
Enumerableをincludeしても、mapやselectメソッドで返ってくる値がいつの間にはArrayに変わってしまいます。
集合を作るつもりでCollectionの名前を冠するクラスを用意したのに、知らない間にクラスが変わってしまうのは辛いので、mapやselectなどを実行した時に、同じクラスの集合を返すような書き方というのは無いのでしょうか?