2015-06-24 27 views
0

我正在尋找一種可與JavaScript的Array.prototype.every方法媲美的方法,但使用紅寶石。在JavaScript中,它遍歷數組並返回true,如果每個元素都導致回調返回true。關於它的好處之一是,如果其中一個元素未能通過測試,它並不會在整個數組上迭代。相反,它會短路並返回錯誤。是否有與JavaScript的Array.prototype.every方法等價的ruby?

function isBigEnough(element) { 
    return element >= 10; 
} 
[12, 5, 8, 130, 44].every(isBigEnough); //=> false 
[12, 54, 18, 130, 44].every(isBigEnough); //=> true 

我知道我能得到與下級迭代器像while環路類似的效果。

def isBigEnough(arr) 
    i = 0 
    result = true 
    while i < arr.length 
    if arr[i] >= 10 
     i++ 
    else 
     i = arr.length 
     result = false 
    end 
    end 
    return result 
end 
is_big_enough([12, 5, 8, 130, 44]) #=> false 
is_big_enough([12, 54, 18, 130, 44]) #=> true 

但我想紅寶石會有這個東西。任何人都知道如何得到相同的效果?

+0

嘗試['all?'](http://ruby-doc.org/core-2.2.2/Enumerable.html#method-i-all-3F)方法。 – orde

+4

如果你downvote,請留下評論,解釋爲什麼 – williamcodes

+0

我沒有downvote,但它不應該很難找出有人可能選擇downvote一個問題,可以通過簡單地瀏覽文檔或做一個快速的Google搜索。 –

回答

3

我會用all?

my_array.all? { |element| element >= 10 } 

您傳入的block代碼的功能等同於在JavaScript中傳遞函數。

0
is_big_enough = -> element { element >= 10 } 
[12, 5, 8, 130, 44].all?(&is_big_enough) # => false 
[12, 54, 18, 130, 44].all?(&is_big_enough) # => true 

[{ |obj| block } ]Enumerable#all?truefalse

傳遞到給定的塊集合中的每個元素。如果該塊永不返回falsenil,則該方法返回true。如果沒有給出塊,Ruby添加隱含塊{ |obj| obj },這將導致all?返回true當收集成員都不是falsenil

%w[ant bear cat].all? { |word| word.length >= 3 } #=> true 
%w[ant bear cat].all? { |word| word.length >= 4 } #=> false 
[nil, true, 99].all?        #=> false 
相關問題