Ruby-lambda contre Proc.[dupliquer]

possibilité de duplication:

Quelle est la différence entre un proc et un lambda en rubis?

quand lancez ce Ruby code:

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

Comme pour func_two , où est la valeur de la première return , c'est-à-dire, 123 ?

Merci.

31
demandé sur Community 2011-08-12 20:19:26
la source

3 ответов

C'est l'une des principales différences entre Procs et lambdas.

un retour dans un Proc retourne de son bloc/méthode d'enclos, tandis qu'un retour dans un lambda retourne simplement de la lambda. Lorsque vous appelez la lambda à l'intérieur de la func_two, elle renvoie simplement sa valeur en place, qui n'est pas sauvegardée.

lire sur Procs v. lambdas ici: http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls

voir duplicate so question: Pourquoi est-il de retour explicite faire la différence dans un Proc?

EDIT:

pour illustrer cette différence, changez func_one et func_two pour 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
...
23
répondu numbers1311407 2017-05-23 15:34:34
la source

dans le proc, le return "123" bouillonne et revient de la fonction extérieure, func_one . Par conséquent, la deuxième déclaration n'est jamais rencontrée.

dans la lambda, le return "123" ne revient que de la lambda. Vous ne définissez pas une variable à la valeur de retour de la lambda (lorsque vous faites lambda_new.call , donc la valeur est essentiellement juste jeté. Ensuite ,le return "456" est appelé et retourne de la fonction. Si, au lieu de retourner "456" , vous avez retourné lambda_new.call , la valeur de retour de func_two serait "123" .

4
répondu Emily 2011-08-12 20:25:53
la source

123 est une valeur de lambda_new.call , mais il n'est pas utilisé et ne se présente pas.

0
répondu Victor Deryagin 2011-08-12 20:26:04
la source

Autres questions sur