2016-08-02 93 views
2

因此,Ruby有一個select方法,可以根據從塊傳入的條件從數組中選取元素。Ruby選擇方法:檢查選擇的項目數

例如

arr = [1,2,3,4] 
arr.select {|x| x.even? } => [2, 4] 

我的問題涉及大陣,我只希望一定數量的選擇項。例如,在陣列之外,我只需要匹配條件的前5個數字。

arr.select{|x| x.even?}[0...5] 

這是我到目前爲止。這是非常緩慢的,因爲在選擇前五個元素之前,Ruby在整個數組上運行select函數。

我想看看是否有辦法停止選擇功能,當前五個元素被選中。

例如,如果我能做到這一點

res = arr.select do |x| 
    x.even? 
    break if self.length > 5 
end 

在這種情況下,自對res數組的引用。我認爲這個參考文件不會起作用,但我希望它能夠說明我的觀點。

回答

6

在這種情況下,self是對res數組的引用。

Ruby中的關鍵字self可讓您訪問當前對象 - 接收當前消息的對象。

我認爲這是Enumerator::Lazy工作:

>> (1..100000).lazy.select { |x| x.even? }.first(5) 
=> [2, 4, 6, 8, 10] 
+1

這正是我所需要的。非常感謝你。 – davidhu2000

2

lazy是量身定做的,但你也可以寫

1.step.each_with_object([]) do |x, arr| 
    arr << x if x.even? 
    break arr if arr.size == 5 
end 
    #=> [2, 4, 6, 8, 10] 

此外,Enumerator#lazy看到光明的一天在Ruby中v2.0,Enumerable#each_with_object v1.9,Enumerable#reduce(又名inject),它們也可以更早地使用,因此您選擇的方法可能取決於您希望支持的最早版本的Ruby。還有一件事:如果效率很重要,您可能需要進行基準測試,因爲lazy的聲譽相對較慢。