2012-03-19 4 views
31

Qual è il modo più veloce in Ruby per ottenere il primo elemento enumerabile per il quale un blocco restituisce true?Qual è il modo più veloce in Ruby per ottenere il primo elemento enumerabile per il quale un blocco restituisce true?

Ad esempio:

arr = [12, 88, 107, 500] 
arr.select {|num| num > 100 }.first # => 107 

mi piacerebbe fare questo senza che attraversa l'intero array, come select volontà, dal momento che ho solo bisogno la prima partita.

So che potrei fare uno each e interrompere il successo, ma ho pensato che esistesse un metodo nativo per farlo; Non l'ho trovato nella documentazione.

risposta

61

Diverse classi nucleo rubino, tra Array e Hash comprendono il modulo Enumerable che fornisce molti metodi utili per lavorare con queste enumerazioni.

Questo modulo fornisce la find or detect methods che fa esattamente ciò che si vuole raggiungere:

arr = [12, 88, 107, 500] 
arr.find { |num| num > 100 } # => 107 

Entrambi i nomi dei metodi sono sinonimi tra loro e fanno esattamente la stessa.

+0

+1, mi sono completamente dimenticato di 'find', duh. –

+0

Ah! 'find' era il metodo che stavo cercando di ricordare. Stupido me, stavo guardando i documenti per 'Array', non' Enumerable'. –

+4

noto anche nel mondo Ruby come 'detect' – tokland

4
arr[arr.index {|num| num > 100 }] #=> 107 
+0

Questo non è quello che è stato richiesto ma quello di cui avevo bisogno, grazie !! – Gabber

1
arr.find{|el| el>100} #107 (or detect; it's in the Enumerable module.) 
Problemi correlati