在 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 循环中的循环,类似于“继续”[重复]

编写一个 Pyspark UDF,其功能类似于 Python any 函数

如何检查一个值是不是存在于Ruby中的数组中