que - ¿Cuándo usar una lambda en Ruby on Rails?
ruby on rails tutorial (7)
¿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.
¿Qué es lambda?
Prueba esto con tu irb .
lam = lambda { puts "Hello world"}
lam.class
#output is
=> Proc
lambda en 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? La comparación explicará los usos
Lambdas comprueba la cantidad de argumentos, mientras que los procs no.
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 procs tratan la palabra clave ''return'' de manera diferente (Lea el artículo a continuación, por ejemplo)
Lea este excelente artículo para obtener más información http://awaxman11.github.io/blog/2013/08/05/what-is-the-difference-between-a-block/
Donde he visto que Lambda se usa está en las 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 cambie el recuento de usuarios.
Es una pieza de código que le permite pasar.
Es especialmente útil en named_scope, te permite hacer algo como esto:
named_scope :scoped_by_user, lambda {|user| {:conditions=>{:user_id=>user.id}}}
Supongamos que tiene un modelo de proyecto y desea obtener todos los proyectos para un usuario en particular, puede hacer algo como esto:
Project.scoped_by_user(123)
Muchas opciones de validator aceptan un lambda o Proc si el trabajo es demasiado simple para garantizar una función nombrada. Por ejemplo :if
y :unless
.
validates :thing, presence: true, unless: ->(obj) { obj.something? }
:message
aceptará un Proc para mensajes de validación personalizados.
validates :terms, acceptance: {
message: ->(person) "%{person.name} must accept our terms!"
}
Generalmente, las lambdas (y las devoluciones de llamada en general) son útiles como una forma ligera para permitir una mayor personalización de la que permite una cadena o un número, pero sin que el usuario tenga que escribir una clase completa.
No veo dónde haces 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, Algunos cierres útiles en Ruby , debería ser útil, así como esto: http://www.robertsosinski.com/2008/12/21/understanding-ruby-blocks-procs-and-lambdas/
lambda es excepcionalmente útil en named_scope
, por lo que puede pasar parámetros a named_scopes
.
http://augustl.com/blog/2008/procs_blocks_and_anonymous_functions/ tiene un resumen de lo que son los bloques / procs / lambdas, cómo puede usarlos y cómo se comparan con las funciones en otros idiomas. Definitivamente responde tu pregunta.
Tenga en cuenta que la última sección ''Una nota sobre lambdas'' menciona un punto que solo es cierto en Ruby 1.8 y se cambió en 1.9 - Ruby: Proc.new {''waffles''} vs. proc {''waffles''}