2012-03-25 10 views
1

私は「人間」の方法を使って数独ソルバーを開発しています。ディレクトリに戦略を適用する

私はlib/strategiesディレクトリに戦略のリストを持っており、それらはすべて同じように機能する、それがどのように私は自動的に私が選択した順序でディレクトリ内のすべての戦略を適用しない。このStrategyName.new(sudoku).apply

のように言うことは?私は、各戦略にIDを与えて、例えば戦略リストにその位置を返すようにしたり、ソルバークラスで正しい順序ですべてを登録したりすることができます。しかし、どのようにそれらをすべて列挙して適用するのですか? (自動ロードオン)

ありがとうございます!

Dir[File.expand_path("../strategies/*.rb", __FILE__)].each do |f| 
    name = File.basename(f, ".rb") 
    klass = name.capitalize.gsub(/(_([a-z]))/) { |c| c[1].upcase } 
    @strategies << const_get(klass).new(sudoku) 
end 

@strategies.sort_by! { |s| s.priority } 

各戦略と仮定すると#priority方法があります。

+0

「SN.new(SN.new(sudoku).apply).apply' ...のようなものですか? – Dogbert

+0

@Dogbert、戦略設計パターンを見てください。通常はループです。 – d11wtq

答えて

2

と仮定すると、あなたのファイルは、一般的な、一般的な命名規則に従ってください。

@strategies.each { |s| break if s.apply } 
+0

また、オートローディングがオンであるとはいえ、 'require f'が必要な場合もあります。 – d11wtq

+0

'const_get'の代わりに' constantize'を使用しました(モジュールにラップする必要があります)。素晴らしいスニペットをありがとう! – Cydonia7

+0

問題ありません! Railsアプリケーションの場合は、アンダースコア文字列をキャメルケース文字列に変換する方法もあります。 '@strategies << File.basename(f、" .rb ")。camelize.constantize.new(..)' gsubのものではなく、上記の 'name.camelize'です。 – d11wtq

関連する問題