2012-03-01 22 views
1

私はクラスのいくつかのオプションを設定する方法を考え出しています。 'options'はハッシュです。私は他の場所でこれは間違っていますが、どうして良いですか?

3を使用するために、いくつかのインスタンス変数を設定する)と@current_optionsように処理オプションで別のハッシュを設定する)私が欲しいか

2を必要としないオプションをフィルタリング)

1にしたいです。私は、コマンドラインからラインで、この行を行うと

{:timestamps_offset=>0, :destructive=>false, :minimal_author=>false} 

が、それは私が望むように動作します:私は推測している

def initialize_options(options) 
    @whitelisted_options, @current_options = [:timestamps_offset, :destructive, :minimal_author], {} 
    n_options = options.select { |k,v| @whitelisted_options.include?(k) } 
    @current_options[:timestamps_offset] = @timestamp_offset = n_options.fetch(:timestamps_offset, 0)*(60*60*24) 
    @current_options[:destructive] = @destructive = n_options.fetch(:destructive, false) 
    @current_options[:minimal_author] = @minimal_author = n_options.fetch(:minimal_author, false) 
end 

これは少しくらい、関係なく、私は私に渡すものを手に入れるんですそれは私のクラスにはありません。それでは何が起こっているのですか?これをどうやってきれいにしますか?

EDIT:これは私が使用しているクラスから実際には機能しませんが、実際には現実は何かが起こっています。私は今は気づいていません。

attr_reader:current_optionsは、これがクラス上でどのように設定されているかを示しています。多分、いくつかのリビジョンが必要です。

EDIT2:実は私は...「オプション」考えていませんでした何かをであることが判明したとして、YAMLファイルから解析しています:メソッドの2行目は@whitelisted_options

EDIT3から選択するようになっています私はシンボルをフェッチしていました。その方法を変更すると、メソッドがシンボルを探していて、見つからなかった場合には、違いが生じます。 "destructive" vs:destructiveなので、常にデフォルトにデフォルト設定されています。つまり、オプションをインポートするときにハッシュキーを象徴する必要がありました。

答えて

1

@current_optionsは、空のハッシュとして初期化されます。 optionsをparamsとして渡すと、 @current_optionsにはキーが存在しないので、 n_optionsは空になります。

次に、@current_optionsを次の行に設定すると、常にデフォルト値(0, false, false)が取得されます。そのため、出力は常に同じです。

@current_options || = {}

ポストOP編集:あなたは、それが一度だけ{}に設定していますように、条件付きで@current_optionsを初期化することによって、この問題を解決

をご問題はoptions.selectである - Ruby 1.8では、ハッシュを返すのではなく、配列を返す。 fetchへの呼び出しは常に失敗します(シンボルは配列のインデックスにできないため)、常にデフォルトを返します。

代わりに、試してください:p各キー/値のペアを含む配列である

n_options = options.inject({}) {|h, p| h[p[0]] = p[1] if @whitelisted_options.include? p[0]; h } 

Ruby 1.9.2では、Hash.selectは期待通りに動作します。

編集2:ここでは、私はそれにアプローチしたい方法は次のとおりです。使用で

class Foo 
    @@whitelisted_options= {:timestamps_offset => 0, :destructive => false, :minimal_author =>false} 

    @@whitelisted_options.keys.each do |option| 
    define_method(option) { return @current_options[option] rescue nil} 
    end 

    def initialize_options(options) 
    @current_options = {} 
    @@whitelisted_options.each {|k, v| @current_options[k] = options[k] || v} 
    @current_options 
    end 
end 

:@whitelisted

f = Foo.new 
f.destructive #=> nil 
f.initialize_options(:minimal_author => true, :ignore => :lol) 
f.destructive #=> false 
f.minimal_author #=> true 
f.timestamps_offset #=> 0 
+0

私はそれを変更しましたが、元々反映しませんでした。 n_optionsは無効なオプションを削除したオプションです。 – blueblank

+0

これは近いですが、実際には設定変数を返すわけではありません。つまり、デフォルトのオプションが常に返されます(または私はまだそれが見えません)。しかし、それは近いですし、私は少し違うことにもう一つの手がかりを与えます。 – blueblank

+0

@blueblank私のコードは、@ @ current_options'を設定した後、 '@whitelisted_options'を返していました。修正されました: – andrewdotnich

0
  1. @whitelisted_optionsとは何ですか?
  2. :destructiveoptionsのキーでない場合はどうしますか? :destructive => falseを持っていますか、@current_optionsには:destructiveと言及したくありませんか?
+0

は、クラスが利用できるオプションのリストだけです。基本的にはこれらのオプションだけを受け入れ、他のオプションが破棄された場合は他のオプションを破棄します。 – blueblank

+0

@destructiveはデフォルトでfalseに設定する必要があります – blueblank

+0

@blueblank: '@whitelisted'はなぜローカル変数ではなくインスタンス変数ですか? –

関連する問題