2011-10-12 28 views
3
>> [1, 2, 3, 4, 5].any? {|n| n % 3 == 0} 
=> true 

如果我想知道哪些項目匹配,不只是是否項目的方法是否匹配?我只對短路解決方案感興趣(那些只要找到匹配就停止迭代的解決方案)。在Ruby中,有沒有類似`任?`返回匹配的項目(而不是'真')

我知道我可以做以下事情,但是因爲我是Ruby新手,我很想學習其他選項。

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

可能重複(http://stackoverflow.com/questions/2381163/ruby​​-array-find-first-object) –

回答

6

您正在尋找這樣的:

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

docs

通行證枚舉阻止每個條目。返回第一個塊不是假的。

所以這也將滿足您的'短路'要求。 Enumerable#find的另一個可能不常用的別名是Enumerable#detect,它的工作方式完全相同。

+0

謝謝。非常有幫助的答案,比其他人快一點。 :) – davidchambers

3

如果你想短路行爲,你想可枚舉#找,不要選擇

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

如果你想爲這你塊truthy第一要素,使用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(不短路):[?紅寶石陣find_first對象]

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

很好的答案,謝謝。我接受了浮雕的答案,因爲它已經提前一兩分鐘發佈了。 – davidchambers

+0

不用擔心,謝謝你的評論! –

相關問題