必要な機能は、Array が継承する Enumerable の select に自然に適合します。
リスト、AKA、配列について話しているので、select を使用して、ムービーをメソッドに渡すのではなく、それに基づいて構築することにより、ムービーが基準を満たすかどうかを判断するのが自然に適しています。
別の Filter クラスも Ruby のやり方には適合しません。映画リストの Array をサブクラス化し、条件をパラメーターとして受け取るフィルター メソッドを追加することを検討してください。
その機能を次のように記述しますが、より Ruby に似ていると思われる方法でそれを実行します。
require 'pp'
class Movies < Array
def initialize(*movies)
super(movies)
end
def filter(criteria={})
self.select{ |m|
criteria.all?{ |c, v|
m.send(c, v)
}
}
end
end
class Movie
def initialize(attributes={})
@movie = attributes
end
def name(t)
case t
when Regexp
@movie[:name][t]
when String
@movie[:name] == t
end
end
def genre(g)
@movie[:genre] == g
end
def year(y)
@movie[:year] == y
end
end
movies = Movies.new(
Movie.new(name: 'Batman', genre: 'Drama', year: 2001),
Movie.new(name: 'The Shawshank Redemption', genre: 'Drama', year: 1994),
Movie.new(name: 'Raiders of the Lost Ark', genre: 'Action', year: 1981)
)
pp movies.filter(year: 1981)
pp movies.filter(genre: 'Drama', year: 2001)
pp movies.filter(name: /redemption/i)
Movie クラスのハッシュを使用したのは、より高速だからです。これも汚い方法ですが、うまくいきます。
コードを実行した結果は次のとおりです。
[#<Movie:0x007ff7b191ffb8
@movie={:name=>"Raiders of the Lost Ark", :genre=>"Action", :year=>1981}>]
[#<Movie:0x007ff7b1920260
@movie={:name=>"Batman", :genre=>"Drama", :year=>2001}>]
[#<Movie:0x007ff7b19200d0
@movie={:name=>"The Shawshank Redemption", :genre=>"Drama", :year=>1994}>]
ムービーをフィルタリングする実際の流れは、通常の Ruby コードの書き方に当てはまります。もっとうまくやれるかもしれませんが、それがスタートです。