2009-08-28 15 views
43

Voglio creare un filtro ed essere in grado di applicarlo a un array o un hash. Per esempio:Come posso creare un blocco/proc/lambda riutilizzabile in Ruby?

def isodd(i) 
    i % 2 == 1 
end 

La voglio essere in grado di usarlo in questo modo:

x = [1,2,3,4] 
puts x.select(isodd) 
x.delete_if(isodd) 
puts x 

Questo sembra che dovrebbe essere dritto in avanti, ma non riesco a capire cosa devo fare lo fa funzionare.

risposta

68

Creare un lambda e poi convertire in blocco con il & dell'operatore:

isodd = lambda { |i| i % 2 == 1 } 
[1,2,3,4].select(&isodd) 
+3

È inoltre possibile utilizzare l'operatore "stabby lambda" per creare il processo autonomo. Vedi http://stackoverflow.com/questions/9340117/what-is-the-stab-operator-in-ruby. Disponibile da 'rubino 1.9'. Naturalmente, puramente una questione di gusto e stile di codifica :) – zealoushacker

+0

per chi legge, in futuro, si può anche creare lambda come questo: lambda_name = ->() {puts "Hello World"} – BKSpurgeon

18

è possibile creare un nome Proc e passarlo ai metodi che si blocchi:

isodd = Proc.new { |i| i % 2 == 1 } 
x = [1,2,3,4] 
x.select(&isodd) # returns [1,3] 

Il & operatore converte tra un Proc/lambda ed un blocco, che è ciò che metodi come select aspettano.

27
puts x.select(&method(:isodd)) 
+0

risposte di Dave e Daniel sono anche buoni. Questa è un'alternativa. –

+2

+1 La risposta è utile quando si ha un metodo esistente che non si desidera riscrivere come lambda/proc. Funziona anche se il metodo deve essere chiamato su un oggetto specifico: 'x.select (& obj.method (: VAL.DISPARI))' – Kelvin

+0

bello e questo risponde correttamente alla domanda posta - che ragazzo ha voluto sapere come avvolgere una esistente metodo e passarlo come un proc – Dan

Problemi correlati