2012-11-12 12 views

risposta

82

Prova questo:

my_array.find{|x| x.some_test } 

O qui è una scorciatoia (grazie @LarsHaugseth per ricordare a questo proposito)

my_array.find(&:some_test) 
+3

Può essere accorciato a 'my_array.find (&: some_test)' –

+0

@LarsHaugseth: Hai ragione, naturalmente. Grazie. –

4

per quanto mi trovo sembra complicato. Come mi aspetto di ricevere più di un oggetto per tale richiesta.

Preferisco utilizzare detect per ottenere uno distinto.

E select per trovarli tutti.

qui quello docs rubino dice su di loro:

detect(ifnone = nil) {| obj | block } → obj or nil click to toggle source 
find(ifnone = nil) {| obj | block } → obj or nil 
detect(ifnone = nil) → an_enumerator 
find(ifnone = nil) → an_enumerator 

Passaggi ogni voce enum per bloccare. Restituisce il primo per il quale il blocco non è falso. Se nessun oggetto corrisponde, chiama ifnone e restituisce il suo risultato quando viene specificato, o restituisce altrimenti.

find_all {| obj | block } → array click to toggle source 
select {| obj | block } → array 
find_all → an_enumerator 
select → an_enumerator 

restituisce un array contenente tutti gli elementi della enum per i quali blocco non è falso

+1

trovare/rilevare, mappare/raccogliere, ridurre/iniettare - c'è un metodo per tutti :) –

+5

Per me, 'detect' non sembra affatto un metodo corretto. 'find' almeno può * trovare * e restituire qualcosa. Cosa 'rileva' fa e restituisce - Non ho idea senza consultare i documenti. –

+0

Tuttavia, la comunità di rubini si è basata principalmente su 'find'. Una buona ragione per cambiare. – pguardiario

Problemi correlati