假设我有一个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")
编辑:
考虑到您想要删除键,块形式是我个人认为更好的选择,因为它将返回块评估的任何内容。
但是,第二个选项更容易理解。
关键字参数:
如果您正在使用 Ruby 2.0 或更高版本,最常见的做法是使用关键字参数:
def foo(bar: 10)
# do something with bar
end
def foo(opts={})
bar = opts.fetch(:bar, 10)
# do something with bar
end
fetch
比使用opts[:bar] || 10
更好,因为它允许方法的调用者指定bar=nil
或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
nil
的情况。 - Andrew Marshall