Ruby hash:返回第一个不是nil的键值

时间:2018-05-05 15:46:27

标签: ruby

说我有哈希

hash = {a:1, b:false, c:nil}

&安培;某处的一系列密钥:[:c, :b, :a]。是否有一个Ruby习惯用于返回这样的键值!= nil?

obv

[:c, :b, :a].select {|key| hash[key] != nil}.first     # returns :b

似乎太长了。

3 个答案:

答案 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