说我有哈希
hash = {a:1, b:false, c:nil}
&安培;某处的一系列密钥:[:c, :b, :a]
。是否有一个Ruby习惯用于返回这样的键值!= nil?
obv
[:c, :b, :a].select {|key| hash[key] != nil}.first # returns :b
似乎太长了。
答案 0 :(得分:4)
为此,我认为Enumerable#find
可能有效:
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
答案 1 :(得分:1)
如果要过滤带有虚假值的元素,可以使用以下表达式。
keys = [:d, :c, :b, :a]
hash = { a: 1, b: nil, c: nil, d: 2 }
keys.select(&hash)
# => [:d, :a]
如果你想过滤nil作为值的元素,那就不正确,正如Ilya先生写的那样。
答案 2 :(得分:1)
您可以使用detect
如果匹配,这将返回第一个值。
[:c, :b, :a].detect { |key| hash[key] != nill }
。这将返回:b。
希望能帮到你:D