任何人都可以向我展示一种检查哈希中是否存在密钥的红宝石方式,如果没有,则为其提供默认值。我假设有一个衬垫使用,除非这样做,但我不知道该使用什么。
答案 0 :(得分:47)
如果您已经有哈希,可以这样做:
h.fetch(key, "default value")
或者您利用了一个不存在的密钥将返回nil
:
h[key] || "default value"
要使用默认值创建哈希值,它取决于您要完全执行的操作。
独立于密钥且不会被存储:
h = Hash.new("foo")
h[1] #=> "foo"
h #=> {}
取决于密钥并将被存储:
h = Hash.new { |h, k| h[k] = k * k }
h[2] #=> 4
h #=> {2=>4}
答案 1 :(得分:19)
Hash类的构造函数接受默认值,如果找不到匹配的键,则返回相同的值。
h = Hash.new("default")
h.has_key?("jake")
=> false
h["jake"]
=> "default"
h["jake"] = "26"
h.has_key?("jake")
=> true
答案 2 :(得分:13)
如果您不需要将该默认值存储到哈希中,则可以使用Hash#fetch
方法:
hash = {}
hash.fetch(:some_key, 'default-value') # => 'default-value'
p hash
# => {}
如果您每次访问不存在的密钥时都需要存储默认值,并且您是初始化哈希值的人,则可以使用带有块的Hash#new
来执行此操作:
hash = Hash.new { |hash, key| hash[key] = 'default-value' }
hash[:a] = 'foo'
p hash[:b]
# => 'default-value'
p hash
# => { :a => 'foo', :b => 'default-value' }
答案 3 :(得分:6)
您可以使用||=
运算符:
hash = {some_key: 'some_value'}
puts hash[:some_key] ||= 'default_value' # prints 'some_value'
puts hash[:non_existing_key] ||= 'default_value' # prints 'default_value'
puts hash.inspect # {:some_key=>"some_value", :non_existing_key=>"default_value"}
答案 4 :(得分:5)
如果要存储的默认值可能为零,则需要在存储时计算它:
hash = {}
...
hash.fetch(key) {|k| hash[k] = calc_default()}