Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby hash:返回第一个键值,其下的值不是nil_Ruby - Fatal编程技术网

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或更高版本中可用。