鉴于我有一个可能缺少键的选项哈希,什么被认为是更好或更惯用的 Ruby?这个:
my_val = opts.delete(:key){|k| default_value_for_key }
或者:
my_val = opts.delete(:key) || default_value_for_key
鉴于我想在提取值时从哈希中删除键。
鉴于我有一个可能缺少键的选项哈希,什么被认为是更好或更惯用的 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")
编辑:
鉴于您要删除密钥,块形式是恕我直言的方式,因为它将返回块评估的任何内容。
但是,第二种选择对眼睛来说更容易。
关键字参数:
如果您使用的是 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
usingfetch
可能比 using 更好,opts[:bar] || 10
因为它允许方法的调用者指定bar=nil
or bar=false
。该||
运算符将导致您覆盖从哈希返回的任何值,如果它是 nil 或 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