コードレビューの中で以下のようなコード(あくまでサンプル)を見つけました。
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
などを実行した時に、同じクラスの集合を返すような書き方というのは無いのでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。