Ruby hash:返回第一个键值,其下的值不是nil
说我有一个杂烩Ruby hash:返回第一个键值,其下的值不是nil,ruby,Ruby,说我有一个杂烩 hash = {a:1, b:false, c:nil} &某处的一系列键:[:c,:b,:a]。有没有一个Ruby习惯用法用于返回这样一个键值零 obv [:c, :b, :a].select {|key| hash[key] != nil}.first # returns :b 似乎太长了。我认为这可能有用: find(ifnone = nil) { |obj| block } → obj or nil find(ifnone = nil) → an_enumer
hash = {a:1, b:false, c:nil}
&某处的一系列键:[:c,:b,:a]
。有没有一个Ruby习惯用法用于返回这样一个键值零
obv
[:c, :b, :a].select {|key| hash[key] != nil}.first # returns :b
似乎太长了。我认为这可能有用:
find(ifnone = nil) { |obj| block } → obj or nil
find(ifnone = nil) → an_enumerator
将枚举中的每个项传递给块。返回哪个块的第一个值
这不是假的。如果没有匹配的对象,则调用ifnone
并返回其
指定时返回结果,否则返回nil
如果没有给出块,则返回枚举数
在您的情况下,它将返回第一个块不是nil
:
p %i[c b a].find { |key| !{ a: 1, b: nil, c: nil }[key].nil? } # :a
p %i[c b a].find { |key| !{ a: 1, b: 1, c: nil }[key].nil? } # :b
如果要使用falsy值筛选元素,可以使用以下表达式
keys = [:d, :c, :b, :a]
hash = { a: 1, b: nil, c: nil, d: 2 }
keys.select(&hash)
# => [:d, :a]
如伊利亚先生所写,如果您想过滤值为零的元素,这是不正确的。您可以使用
检测
如果匹配,这将返回第一个值。
[:c,:b,:a]。检测{key | hash[key]!=nill}
。这将返回:b。
希望能帮助你:D我从你的代码中得到了“:a”很抱歉,我现在看到您要求的是更简短的表达式。@set0gut1是否希望它返回键/值或仅返回值?@Anthony仅返回键如果
hash={a:1,b:1,c:nil}
和[:c,:b,:a]
,仍然错误不是零
不同于是真的
{a:1,b:nil,c:false,d:2}
=>[:d,:a]
向上,非常聪明keys.select(&hash)。如果需要满足条件的第一个元素,则first
keys.find(&hash)
较短。请注意,hash\to\u proc
仅在Ruby 2.3.0或更高版本中可用。