在 Ruby 中,是不是有类似于 `any?` 的方法返回匹配项(而不是 `true`)
Posted
技术标签:
【中文标题】在 Ruby 中,是不是有类似于 `any?` 的方法返回匹配项(而不是 `true`)【英文标题】:In Ruby, is there a method similar to `any?` which returns the matching item (rather than `true`)在 Ruby 中,是否有类似于 `any?` 的方法返回匹配项(而不是 `true`) 【发布时间】:2011-12-05 19:53:51 【问题描述】:>> [1, 2, 3, 4, 5].any? |n| n % 3 == 0
=> true
如果我想知道哪个项匹配,而不仅仅是是否项匹配?我只对短路解决方案(一旦找到匹配就停止迭代的解决方案)感兴趣。
我知道我可以执行以下操作,但由于我是 Ruby 新手,我很想了解其他选项。
>> match = nil
=> nil
>> [1, 2, 3, 4, 5].each do |n|
.. if n % 3 == 0
.. match = n
.. break
.. end
.. end
=> nil
>> match
=> 3
【问题讨论】:
Ruby Array find_first object? 的可能重复项 【参考方案1】:你在找这个吗:
[1, 2, 3, 4, 5].find |n| n % 3 == 0 # => 3
来自docs:
将枚举中的每个条目传递给阻塞。返回第一个不为 false 的块。
所以这也可以满足您的“短路”要求。 Enumerable#find
的另一个可能不太常用的别名是Enumerable#detect
,它的工作方式完全相同。
【讨论】:
谢谢。非常有帮助的答案,并且比其他答案快一点。 :)【参考方案2】:如果你想要你的块是真的第一个元素,使用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
(这不会短路):
[1, 2, 3, 4, 5, 6].select |n| n % 3 == 0
# => [3, 6]
【讨论】:
很好的答案,谢谢。我接受了 emboss 的回答,因为它早一两分钟就发布了。【参考方案3】:如果你想要短路行为,你想要 Enumerable#find,而不是 select
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]
【讨论】:
以上是关于在 Ruby 中,是不是有类似于 `any?` 的方法返回匹配项(而不是 `true`)的主要内容,如果未能解决你的问题,请参考以下文章
ruby 中是不是有适用于 ISO 8601 的综合库/模块?
Ruby 枚举是不是有 `with_self` 或类似的块?
jQuery 是不是有类似 :any 或 :matches 伪类的东西?
在 Ruby 中,如何跳过 .each 循环中的循环,类似于“继续”[重复]