2012-04-18 9 views
8

estoy leyendo a lo largo de la piqueta 1,9 y el autor utiliza lambda como esto:Diferencia entre lambda y method_name def en Ruby

bo = lambda {|param| puts "You called me with #{param}"} 
bo.call 99  => 'You called me with 99' 
bo.call "cat" => 'You called me with cat' 

Mi pregunta es la siguiente: ¿Cómo es esto nada mejor/peor/diferente que sólo la definición un método que hace lo mismo? De esta manera:

def bo(param) 
    puts "You called me with #{param}" 
end 

bo("hello") => 'You called me with hello' 

Para mí, la sintaxis lambda parece mucho más confusa y espagueti.

+0

Añadiendo la función dinámica – texasbruce

+1

También lambda es un Proc especial. No es un método. – texasbruce

Respuesta

13

Lambdas:

  • son variaciones de Procs,
  • se puede convertir a/de blocks,
  • no comienzan una nueva closure scope (lo que significa que puede acceder a las variables definidas fuera del alcance de su lambda, a diferencia de def),
  • se pueden pasar como variables.

Recomiendo ir a this article que explique procs, bloques y lambdas.

Editar: Este enlace no está actualizado. Para referencia futura, pruebe this article

+0

¡Gran respuesta simple! Esto es todo lo que estoy buscando –

3

La ventaja que le da la definición de una lambda es que puede pasar ese objeto lambda como un atributo a otro método.

def method1 &b 
    #... some code 
    b.call 
end 

def method2 &b 
    #... some more code... 
    b.call 
end 

def method3 &b 
    b.call 
    #even more code here 
end 

myCallback = lambda { "this is a callback that can be called from several methods"} 

A continuación, puede utilizar de esta manera:

method1 &myCallback 
method2 &myCallback 
method3 &myCallback 

Y la belleza de esto, es que sólo se escribió de código de la devolución de llamada una vez, sino que se utiliza 3 veces ....

le recomiendo que eche un vistazo a este link para seguir leyendo :)

+1

en el caso de bloques, también puede usar 'yield' en lugar de' block.call'. Esto es de hecho preferido ya que es un poco más rápido. –

Cuestiones relacionadas