在 Ruby 中,是否有类似于“any?”的方法,它返回匹配项(而不是“true”)

发布于 2024-12-09 06:08:15 字数 408 浏览 0 评论 0原文

>> [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
>> [1, 2, 3, 4, 5].any? {|n| n % 3 == 0}
=> true

What if I want to know which item matched, not just whether an item matched? I'm only interested in short-circuiting solutions (those that stop iterating as soon as a match is found).

I know that I can do the following, but as I'm new to Ruby I'm keen to learn other options.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

安人多梦 2024-12-16 06:08:15

您是否在寻找此内容:

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

来自文档

将枚举中的每个条目传递给块。返回第一个不为 false 的块。

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

Are you looking for this:

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

From the docs:

Passes each entry in enum to block. Returns the first for which block is not false.

So this would also fulfill your 'short-circuiting' requirement. Another, probably less common used alias for Enumerable#find is Enumerable#detect, it works exactly the same way.

予囚 2024-12-16 06:08:15

如果您想要块的第一个元素为真,请使用 检测

[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]

If you want the first element for which your block is truthy, use detect:

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

If you want the index of the first element that matches, use find_index:

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

If you want all elements that match, use select (this does not short-circuit):

[1, 2, 3, 4, 5, 6].select {|n| n % 3 == 0}
# => [3, 6]
转身泪倾城 2024-12-16 06:08:15

如果你想要短路行为,你需要 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] 

If you want short circuiting behavior, you want Enumerable#find, not 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] 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文