在Ruby中,有没有类似`任?`返回匹配的项目(而不是'真')

在Ruby中,有没有类似`任?`返回匹配的项目(而不是'真')

问题描述:

>> [1, 2, 3, 4, 5].any? {|n| n % 3 == 0} 
=> true 

如果我想知道哪些项目匹配,不只是是否项目的方法是否匹配?我只对短路解决方案感兴趣(那些只要找到匹配就停止迭代的解决方案)。在Ruby中,有没有类似`任?`返回匹配的项目(而不是'真')

我知道我可以做以下事情,但是因为我是Ruby新手,我很想学习其他选项。

>> match = nil 
=> nil 
>> [1, 2, 3, 4, 5].each do |n| 
.. if n % 3 == 0 
..  match = n 
..  break 
.. end 
.. end 
=> nil 
>> match 
=> 3 
+0

可能重复(http://*.com/questions/2381163/ruby​​-array-find-first-object) –

您正在寻找这样的:

[1, 2, 3, 4, 5].find {|n| n % 3 == 0} # => 3 

docs

通行证枚举阻止每个条目。返回第一个块不是假的。

所以这也将满足您的'短路'要求。 Enumerable#find的另一个可能不常用的别名是Enumerable#detect,它的工作方式完全相同。

+0

谢谢。非常有帮助的答案,比其他人快一点。 :) – davidchambers

如果你想短路行为,你想可枚举#找,不要选择

ruby-1.9.2-p136 :004 > [1, 2, 3, 4, 5, 6].find {|n| n % 3 == 0} 
=> 3 
ruby-1.9.2-p136 :005 > [1, 2, 3, 4, 5, 6].select {|n| n % 3 == 0} 
=> [3, 6] 

如果你想为这你块truthy第一要素,使用detect

[1, 2, 3, 4, 5].detect {|n| n % 3 == 0} 
# => 3 

如果你想要索引匹配的第一个元素,请使用find_index

[1, 2, 3, 4, 5].find_index {|n| n % 3 == 0} 
# => 2 

如果你想相匹配的所有元素,使用select(不短路):[?红宝石阵find_first对象]

[1, 2, 3, 4, 5, 6].select {|n| n % 3 == 0} 
# => [3, 6] 
+0

很好的答案,谢谢。我接受了浮雕的答案,因为它已经提前一两分钟发布了。 – davidchambers

+0

不用担心,谢谢你的评论! –