在 Ruby 中,是否有类似于“any?”的方法,它返回匹配项(而不是“true”)
>> [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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您是否在寻找此内容:
来自文档:
所以这也可以满足您的“短路”要求。
Enumerable#find
的另一个可能不太常用的别名是Enumerable#detect
,它的工作方式完全相同。Are you looking for this:
From the docs:
So this would also fulfill your 'short-circuiting' requirement. Another, probably less common used alias for
Enumerable#find
isEnumerable#detect
, it works exactly the same way.如果您想要块的第一个元素为真,请使用
检测
:如果您想要第一个匹配元素的索引,请使用
find_index
:如果您希望所有元素匹配,请使用
select
(这不会短路):If you want the first element for which your block is truthy, use
detect
:If you want the index of the first element that matches, use
find_index
:If you want all elements that match, use
select
(this does not short-circuit):如果你想要短路行为,你需要 Enumerable#find,而不是 select
If you want short circuiting behavior, you want Enumerable#find, not select