キーが欠落している可能性のある opts のハッシュがあることを考えると、どの Ruby が優れているか、より慣用的であると考えられますか? これ:
my_val = opts.delete(:key){|k| default_value_for_key }
また:
my_val = opts.delete(:key) || default_value_for_key
値を抽出するときにハッシュからキーを削除したい場合。
キーが欠落している可能性のある opts のハッシュがあることを考えると、どの Ruby が優れているか、より慣用的であると考えられますか? これ:
my_val = opts.delete(:key){|k| default_value_for_key }
また:
my_val = opts.delete(:key) || default_value_for_key
値を抽出するときにハッシュからキーを削除したい場合。
fetch
デフォルトのオプションで使用できると思います。
my_val = opts.fetch(:key, "default_value_for_key")
編集:
キーを削除したい場合、ブロックが評価したものを返すため、ブロックフォームは私見です。
ただし、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] || 10
bar=nil
bar=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