web-dev-qa-db-fra.com

Ruby - lambda vs Proc.new

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.

39
Simplicity

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
...
28
numbers1311407

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".

4
Emily

123 est une valeur de lambda_new.call, mais elle n'est pas utilisée et n'apparaît pas.

0
Victor Deryagin