2016-12-21 2 views
-1

Ich suche ein select, dass „Kurzschluss“, sobald er eine bestimmte Anzahl von Elementen zurückgegeben:Builtin Ruby oder ActiveSupport-Funktion für "wählen Sie die ersten n Elemente, die ein Prädikat erfüllen"?

>>> [1, 2, 3, 4, 5].select_first(1) { |x| x.odd? } 
[1] 
>>> [1, 2, 3, 4, 5].select_first(2) { |x| x.odd? } 
[1, 3] 
>>> [1, 2, 3, 4, 5].select_first(1000) { |x| x.odd? } 
[1, 3, 5] 

Gibt es eine Bibliotheksfunktion, entweder in Kern oder in Active, das dies tut? Es ist einfach, meine eigenen zu rollen, aber ich dachte, ich würde nachsehen.

Beachten Sie, dass ich nicht select { ... }.take(n) möchte, weil der Block Nebenwirkungen haben kann.

+0

Welche Nebenwirkungen sind Sorgen um dich? –

Antwort

3

Sie könnten etwas entlang der Linien von

[1, 2, 3, 4, 5].lazy.select{|x| x.odd? }.take(n).to_a 

tun, aber wenn Sie select{ . . }.take(n) vermeiden wollen könnten Sie auch tun:

[1, 2, 3, 4, 5].each{|x| arr << x if x.odd?; break if arr.count == n} 
+0

Oh cool, wusste nicht über '.lazy' –

+3

Wenn Sie' first (n) 'anstelle von' Take (n) 'verwenden, können Sie mit' to_a' aufhören –

+0

zweites Beispiel Ich glaube, Sie meinten 'arr.count 'as' x' ist ein 'Fixnum' und hat keine' count' Methode. – engineersmnky

Verwandte Themen