tutorial rails que ejemplos descargar curso caracteristicas ruby-on-rails ruby

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.



lambda es excepcionalmente útil en named_scope , por lo que puede pasar parámetros a named_scopes .