Et quand vous utilisez l’un plutôt que l’autre ?
Réponses
Trop de publicités?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
.
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.