web-dev-qa-db-fra.com

Quand utiliser un lambda dans Ruby on Rails?

Quand faut-il utiliser un lambda ou un proc? Je les ai vus décrits comme des fonctions anonymes, mais je peine à comprendre ce concept. J'apprécierais tout lien ou exemple d'utilisation de liens en Ruby, mais surtout Ruby on Rails.

46
Cameron

http://augustl.com/blog/2008/procs_blocks_and_anonymous_functions/ présente un aperçu de ce que sont les blocs/procs/lambdas, comment vous pouvez les utiliser et comment ils se comparent à des fonctions dans d'autres langues. Cela répond certainement à votre question.

Sachez que la dernière section "Une note sur lambdas" mentionne un point qui n’est valable que dans Ruby 1.8 et modifiée en 1.9 - Ruby: Proc.new {'waffles'} vs proc {'waffles'}

41
August Lilleaas

Je ne vois pas où vous faites la distinction entre Ruby on Rails et Ruby. Si vous écrivez une application Ruby on Rails, vous écrivez du code Ruby. Si c'est utile dans Ruby, cela devrait l'être dans Ruby on Rails.

Quoi qu'il en soit, cet article, Quelques fermetures utiles dans Ruby, devrait être utile, ainsi que ceci: http://www.robertsosinski.com/2008/12/21/understanding-Ruby- blocks-procs-and-lambdas/

12
ehsanul

C'est un morceau de code qui vous permet de circuler. 

C'est particulièrement utile dans named_scope, cela vous permet de faire quelque chose comme ceci:

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

Supposons que vous ayez un modèle de projet et que vous souhaitiez obtenir tous les projets pour un utilisateur particulier, vous pouvez faire quelque chose comme ceci: 

Project.scoped_by_user(123)
8
ez.

Où j'ai vu Lambda utilisé est en test ...

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

Lambda vous permet d’avoir ce test à la fin pour vous assurer que le code exécuté dans le bloc lambda ne change pas le nombre d’utilisateurs.

7
sudonim

Qu'est ce que le lambda?

Essayez ceci avec votre irb.

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

#output is
=> Proc

lambda in Ruby est également une instance de la classe Proc. Les lambdas sont une autre saveur de procs.

Qu'est-ce que Proc?

Les objets Proc sont des blocs de code liés à un ensemble de variables locales.

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

#output is
=> Hello World

Quelle est la différence entre un proc et lambda? La comparaison expliquera les cas d'utilisation

Lambdas vérifie le nombre d'arguments, contrairement aux procs.

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 et procs traitent le mot clé 'return' différemment (Lisez l'article ci-dessous par exemple)

Lisez cet article pour plus de détails http://awaxman11.github.io/blog/2013/08/05/what-is-the-difference-between-a-block/

7
MadNik

lambda est exceptionnellement utile dans named_scope, afin que vous puissiez passer des paramètres à named_scopes.

3
ErsatzRyan

De nombreuses options validator acceptent un lambda ou un Proc si le travail est trop simple pour justifier une fonction nommée. Par exemple, :if ET :unless .

validates :thing, presence: true, unless: ->(obj) { obj.something? }

:message acceptera un Proc pour les messages du validateur personnalisé.

validates :terms, acceptance: {
    message: ->(person) "%{person.name} must accept our terms!"
}

En règle générale, les lambdas (et les callbacks en général) sont utiles comme moyen léger de permettre plus de personnalisation que ne le permet une chaîne ou un nombre, sans que l'utilisateur ait à écrire une classe complète.

0
Schwern