4

オプションのパラメーター (params/options ハッシュ内) のデフォルト値をメソッドに指定するために使用される次のコードを記述する、より簡潔で慣用的な方法はありますか?

def initialize(params={})
  if params.has_key? :verbose
    @verbose = params[:verbose]
  else
    @verbose = true # this is the  default value
  end
end

次のように単純化したいと思います。

def initialize(params={})
  @verbose = params[:verbose] or true
end

「false」の値を指定したい場合(つまり、この例で引数として渡したい場合)をカバーするために、単に評価するのではなく、条件として実際に使用する必要があることを除いて、これはほとんど機能します。 .has_key? :verboseparams[:verbose]:verbose => false

この単純な例では、簡単に実行できることがわかりました。

def initialize(verbose=false)
  @verbose = verbose
end

しかし、私の実際のコードでは、実際には(いくつかの必須パラメーターに加えて)オプションのパラメーターが多数あり、オプションのパラメーターを params ハッシュに入れたいので、(名前で) いくつかのパラメーターのみを簡単に指定できます。それらをすべて順番にリストする必要はありません(そして、実際には必要のないものをリストする必要がある可能性があります)。

4

4 に答える 4

14

一般的なパターンは、使用することです

def foo(options = {})
  options = { :default => :value }.merge(options)
end

options渡された値を含むハッシュになり、デフォルトのハッシュのオプションが提供されなかったものとして表示されます。

于 2009-12-29T00:21:34.903 に答える
0

これをもっと簡潔に書く別の方法は、

def foo(options = {})
    options.reverse_merge! value1: true, value2: 100
end

これは、渡されたオプションに既にキー :value1 が含まれていない限り、options[:value1] を true (デフォルト値) に設定します。:value2 も同様

于 2013-11-01T11:23:32.610 に答える
0

私はあなたがこれを探していると思います

params = { :verbose => true }.merge(params)
于 2009-12-29T00:27:30.590 に答える