2009-08-05 8 views
42

¿Cuándo se debe usar una lambda o proc? Los he visto descritos como funciones anónimas, pero estoy luchando por comprender este concepto. Agradecería cualquier enlace o ejemplos de cuándo podría usar uno en Ruby, pero especialmente en Ruby on Rails.Cuándo usar una lambda en Ruby on Rails?

Respuesta

39

http://augustl.com/blog/2008/procs_blocks_and_anonymous_functions/ tiene un desglose de qué bloques/procs/lambdas son, cómo puede usarlos, y cómo se comparan con las funciones en otros idiomas. Definitivamente responde tu pregunta.

Haz tener en cuenta que la última sección 'Una nota sobre lambdas' menciona un punto que sólo es cierto en Ruby 1.8 y cambiado en 1,9 - Ruby: Proc.new { 'waffles' } vs. proc { 'waffles' }

+1

fijos de nuevo. Gracias;) –

+0

Enlace ha muerto de nuevo – JeffC

+1

Bleh, lo siento nuevamente, de nuevo. Arreglará. –

3

lambda es excepcionalmente útil en named_scope, para que pueda pasar los parámetros a named_scopes.

9

no veo donde se hace la distinción entre Ruby on Rails y Ruby. Si estás escribiendo una aplicación Ruby on Rails, estás escribiendo el código Ruby, por lo que si es útil en Ruby, debería ser útil en Ruby on Rails.

De todos modos, este artículo, Some Useful Closures in Ruby, debe ser útil, así como la siguiente: http://www.robertsosinski.com/2008/12/21/understanding-ruby-blocks-procs-and-lambdas/

+0

Buen punto. Algún tipo de hoja de trucos que enumera todos los métodos integrados que toman lambda podría tener algún sentido, pero si usted entiende lo que es una lambda, no necesita una hoja de trucos. –

6

Es una pieza de código que le permite pasar alrededor.

Es especialmente útil en named_scope, permite haces algo como esto:

named_scope :scoped_by_user, lambda {|user| {:conditions=>{:user_id=>user.id}}} 

Digamos que tiene un modelo de proyecto y desea obtener todos los proyectos para un usuario en particular, puede hacer algo de esta manera:

Project.scoped_by_user(123) 
5

¿Dónde he visto Lambda utilizado se encuentra en pruebas ...

lambda do 
    post :create, :user => @attr 
end.should_not change(User, :count) 

Lambda le permite realizar esa prueba al final para asegurarse de que el código ejecutado en el bloque lambda no cambia el recuento de usuarios.

5

¿Qué es lambda?

probar esto con su IRB.

lam = lambda { puts "Hello world"} 
lam.class 

#output is 
=> Proc 

lambda in ruby ​​es también una instancia de la clase Proc. Las lambdas son un sabor diferente de procs.

¿Qué es Proc?

Los objetos de proceso son bloques de código que se han vinculado a un conjunto de variables locales.

proc = Proc.new { puts "Hello World" } 
proc.call 

#output is 
=> Hello World 

¿Cuál es la diferencia entre un proc y lambda?Comparacion explicará casos de uso

Lambdas comprobar el número de argumentos, mientras que procsos no lo hacen.

multiply = lambda { |x,y| x*y } 
multiply.call(2,3) #=>6 
multiply.call(2) #ArgumentError: wrong number of arguments (1 for 2) 

multiply = Proc.new {|x| x*x} 
multiply.call(2) # =>4 
multiply.call(2,3) # =>4 (It ignore the second argument) 

Lambdas y procsos tratan el ‘retorno’ de palabras clave diferente (Lea el artículo siguiente, por ejemplo)

Lea este gran artículo para obtener más detalles http://awaxman11.github.io/blog/2013/08/05/what-is-the-difference-between-a-block/