任何人都可以向我展示一种检查哈希中是否存在密钥的红宝石方法,如果没有,则为其提供默认值.我假设有一个衬垫使用,除非这样做,但我不知道该使用什么.
Mic*_*ohl 49
如果您已经有哈希,可以这样做:
h.fetch(key, "default value")
Run Code Online (Sandbox Code Playgroud)
或者您利用了一个不存在的密钥将返回的事实nil
:
h[key] || "default value"
Run Code Online (Sandbox Code Playgroud)
要使用默认值创建哈希,它取决于您要完全执行的操作.
独立于密钥,不会被存储:
h = Hash.new("foo")
h[1] #=> "foo"
h #=> {}
Run Code Online (Sandbox Code Playgroud)取决于密钥并将被存储:
h = Hash.new { |h, k| h[k] = k * k }
h[2] #=> 4
h #=> {2=>4}
Run Code Online (Sandbox Code Playgroud)nkm*_*nkm 19
Hash类的构造函数接受默认值,如果找不到匹配的键,则返回相同的值.
h = Hash.new("default")
h.has_key?("jake")
=> false
h["jake"]
=> "default"
h["jake"] = "26"
h.has_key?("jake")
=> true
Run Code Online (Sandbox Code Playgroud)
KL-*_*L-7 13
如果您不需要将该默认值存储到哈希中,则可以使用以下Hash#fetch
方法:
hash = {}
hash.fetch(:some_key, 'default-value') # => 'default-value'
p hash
# => {}
Run Code Online (Sandbox Code Playgroud)
如果除了每次访问不存在的密钥时都需要存储默认值,并且您是初始化哈希的那个,您可以使用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' }
Run Code Online (Sandbox Code Playgroud)
您可以使用||=
运营商:
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"}
Run Code Online (Sandbox Code Playgroud)
如果要存储可能为nil的默认值,则需要在存储时计算它:
hash = {}
...
hash.fetch(key) {|k| hash[k] = calc_default()}
Run Code Online (Sandbox Code Playgroud)