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

dav*_*ers 3 ruby loops idioms enumerable

>> [1, 2, 3, 4, 5].any? {|n| n % 3 == 0}
=> true
Run Code Online (Sandbox Code Playgroud)

如果我想知道哪个项目匹配,而不仅仅是项目是否匹配,该怎么办?我只对短路解决方案感兴趣(那些在找到匹配后立即停止迭代的解决方案).

我知道我可以做到以下几点,但由于我是Ruby的新手,我很想学习其他选择.

>> match = nil
=> nil
>> [1, 2, 3, 4, 5].each do |n|
..   if n % 3 == 0
..     match = n
..     break
..   end
.. end
=> nil
>> match
=> 3
Run Code Online (Sandbox Code Playgroud)

emb*_*oss 6

你在找这个:

[1, 2, 3, 4, 5].find {|n| n % 3 == 0} # => 3
Run Code Online (Sandbox Code Playgroud)

来自文档:

传递枚举中的每个条目以阻止.返回第一个块不为false的块.

所以这也将满足您的"短路"要求.另一种可能不太常用的别名Enumerable#findEnumerable#detect,它的工作方式完全相同.


Jor*_*ing 5

如果你想要你的块真正的第一个元素,使用detect:

[1, 2, 3, 4, 5].detect {|n| n % 3 == 0}
# => 3
Run Code Online (Sandbox Code Playgroud)

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

[1, 2, 3, 4, 5].find_index {|n| n % 3 == 0}
# => 2
Run Code Online (Sandbox Code Playgroud)

如果您想要匹配所有元素,请使用select(这不会短路):

[1, 2, 3, 4, 5, 6].select {|n| n % 3 == 0}
# => [3, 6]
Run Code Online (Sandbox Code Playgroud)