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)
你在找这个:
[1, 2, 3, 4, 5].find {|n| n % 3 == 0} # => 3
Run Code Online (Sandbox Code Playgroud)
来自文档:
传递枚举中的每个条目以阻止.返回第一个块不为false的块.
所以这也将满足您的"短路"要求.另一种可能不太常用的别名Enumerable#find是Enumerable#detect,它的工作方式完全相同.
如果你想要你的块真正的第一个元素,使用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)
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |