219 votes

Ce qui ' la différence entre un proc et un lambda en Ruby ?

Et quand vous utilisez l’un plutôt que l’autre ?

300voto

jtbandes Points 39804

Une différence est dans la façon de traiter les arguments. La création d'un proc à l'aide de proc {} et Proc.new {} sont équivalentes. Cependant, l'utilisation d' lambda {} vous donne un proc qui vérifie le nombre d'arguments passés à elle. D' ri Kernel#lambda:

L'équivalent de Proc.nouveau, à l'exception de l'résultant Proc objets de vérifier le nombre de paramètres passés lors de l'appel.

Un exemple:

p = Proc.new {|a, b| puts a**2+b**2 } # => #<Proc:0x3c7d28@(irb):1>
p.call 1, 2 # => 5
p.call 1 # => NoMethodError: undefined method `**' for nil:NilClass
p.call 1, 2, 3 # => 5
l = lambda {|a, b| puts a**2+b**2 } # => #<Proc:0x15016c@(irb):5 (lambda)>
l.call 1, 2 # => 5
l.call 1 # => ArgumentError: wrong number of arguments (1 for 2)
l.call 1, 2, 3 # => ArgumentError: wrong number of arguments (3 for 2)

En outre, comme Ken points, à l'aide de return à l'intérieur d'un lambda renvoie la valeur de lambda, mais à l'aide de return dans une procédure de retour de l'enfermant bloc.

lambda { return :foo }.call # => :foo
return # => LocalJumpError: unexpected return
Proc.new { return :foo }.call # => LocalJumpError: unexpected return

Donc, pour la plus rapide des utilisations qu'ils sont de la même, mais si vous voulez automatique stricte argument de contrôle (qui peut aussi parfois aider au débogage), ou si vous avez besoin d'utiliser l' return déclaration à retourner la valeur de la proc, utilisez lambda.

27voto

Ken Bloom Points 27197

En plus de la réponse de jtbandes, il y a aussi une différence dans ce que le instruction renvoie d’en contre `` .

3voto

Chuck Points 138930

C'est un peu subtile. Ils sont à la fois des méthodes qui créent des fermetures, et les deux de retour Proc objets. Il y a en fait une troisième voie que le bien - Proc.new. La différence est dans la façon dont ils se comportent, et les particularités dépendent que vous soyez à l'aide de Ruby 1.8 ou 1.9 (en fait, il y a encore une autre façon de les créer en Ruby 1.9). Dans le cas général, la différence n'est pas quelque chose dont vous devez vous préoccuper. Seulement lorsque vous êtes inquiet au sujet de la rigueur fait-il une différence. Ce DONC, la question porte sur les différences plutôt bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X