Duplicata possible:
Quelle est la différence entre un proc et un lambda en Ruby?
Lorsque vous exécutez ce code Ruby
:
def func_one
proc_new = Proc.new {return "123"}
proc_new.call
return "456"
end
def func_two
lambda_new = lambda {return "123"}
lambda_new.call
return "456"
end
puts "The result of running func_one is " + func_one
puts ""
puts "The result of running func_two is " + func_two
Le résultat que j'obtiens est le suivant:
The result of running func_one is 123
The result of running func_two is 456
Pour ce qui est de func_two
, où est la valeur du premier return
, c'est-à-dire 123
?
Merci.
C'est l'une des principales différences entre Procs et lambdas.
Un retour dans un Proc revient de son bloc/méthode englobant, tandis qu'un retour dans un lambda revient simplement de la lambda. Lorsque vous appelez le lambda à l'intérieur de func_two, il renvoie simplement sa valeur en place, qui n'est pas enregistrée.
Lisez ici Procs c. Lambdas: http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls
Voir duplicate SO question: Pourquoi le retour explicite fait-il une différence dans un Proc?
ÉDITER:
Pour illustrer davantage cette différence, remplacez func_one et func_two par des blocs et voyez ce qui se passe:
> begin; lambda { return 1 }.call end
1
> begin; Proc.new { return 1 }.call end
LocalJumpError: unexpected return
...
Dans le proc, le return "123"
bouillonne et revient de la fonction extérieure, func_one
. Par conséquent, la deuxième instruction de retour n'est jamais rencontrée.
Dans le lambda, le return "123"
ne revient que du lambda. Vous ne définissez pas une variable sur la valeur de retour du lambda (lorsque vous faites lambda_new.call
, donc la valeur est simplement simplement supprimée. Puis le return "456"
est appelé et revient de la fonction. Si, au lieu de renvoyer "456"
, tu es revenu lambda_new.call
, la valeur de retour de func_two
serait "123"
.
123
est une valeur de lambda_new.call
, mais elle n'est pas utilisée et n'apparaît pas.