4

キーが欠落している可能性のある opts のハッシュがあることを考えると、どの Ruby が優れているか、より慣用的であると考えられますか? これ:

my_val = opts.delete(:key){|k| default_value_for_key }

また:

my_val = opts.delete(:key) || default_value_for_key

値を抽出するときにハッシュからキーを削除したい場合。

4

2 に答える 2

3

fetchデフォルトのオプションで使用できると思います。

my_val = opts.fetch(:key, "default_value_for_key")

編集:

キーを削除したい場合、ブロックが評価したものを返すため、ブロックフォームは私見です。

ただし、2番目のオプションは目にやさしいです。

于 2013-07-02T22:40:50.423 に答える
2

キーワード引数:

Ruby 2.0 以降を使用している場合、最も慣用的な方法はキーワード引数を使用することです。

def foo(bar: 10)
  # do something with bar
end

キーワード引数機能は、既定値の割り当てと、不明なキーが指定された場合の例外のスローを自動的に処理します。

Ruby 2.0 を使用していない場合、またはキーワード引数が何らかの理由で機能しない場合は、メソッドが不明なキーを検出してエラーをスローするか、黙って無視するかを決定する必要があります。

不明なキーを黙って無視する:

def foo(opts={})
  bar = opts.fetch(:bar, 10)
  # do something with bar
end

メソッドの呼び出し元がまたはを指定できるため、 を使用fetchするよりも使用する方がよい場合があります。演算子は、ハッシュから返された値が nil または false の場合、オーバーライドすることになります。opts[:bar] || 10bar=nilbar=false||

不明なキーについて不平を言う:

多くのキーがあり、不明なキーが与えられたときに例外をスローしたい場合は、おそらく を使用する必要がありますdelete。ここでの考え方は、既知のキーの削除が完了すると、不明なキーのみが残るというものです。

def foo(opts={})
  opts = opts.dup   # Avoid deleting from the hash the caller passed
                    # in because that would surprise the caller!

  bar = opts.delete(:bar) { 10 }
  # get other options

  raise "Unknown keys #{opts.keys.inspect}" if !opts.empty?

  # do stuff
end
于 2013-07-02T22:54:38.403 に答える