2016-01-14 98 views
3

我需要返回的短切版本匹配

[1, 2, 3, 4, 5, 6, 7, 8].select{|e| e % 2 == 0} 

這是[2, 4, 6],前三個元素,但不嘗試78。我希望它採取的形式

select_some([1, 2, 3, 4, 5, 6, 7, 8], 3){|e| e % 2 == 0} 

我有一個解決辦法如下:

def select_some(array, n, &block) 
    gather = [] 
    array.each do |e| 
    next unless block.call e 
    gather << e 
    break if gather.size >= n 
    end 
    gather 
end 

但有內置到Ruby的東西,執行該短切?請不要建議我在陣列上修補一個方法來實現array.select_some

回答

5

您可以使用懶惰的集合。喜歡的東西:

[1,2,3,4,5,6,7,8].lazy.select { |a| a.even? }.take(3)

你會得到一個Enumerator::Lazy回來,但是當你需要的數據,可以使用to_aforce

+3

您也可以使用'first(3)'而不是'take(3)'來獲得一個數組。 – Stefan

+0

當我檢查上述表達式的返回值時,爲什麼它返回一個枚舉數而不是數組?當我使用'first(3)' –

+0

@WandMaker時,它是有效的,因爲'take'也是懶惰的。 – Stefan