and - Ruby-lambda contra Proc.new
block proc and lambda (3)
Posible duplicado:
¿Cuál es la diferencia entre un proc y un lambda en Ruby?
Cuando ejecute este código de 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
El resultado que obtengo es el siguiente:
The result of running func_one is 123
The result of running func_two is 456
En cuanto a func_two
, ¿dónde está el valor de la primera return
, es decir, 123
?
Gracias.
En el proceso, el return "123"
está burbujeando y regresando de la función externa, func_one
. Por lo tanto, la segunda declaración de retorno nunca se encuentra.
En la lambda, el return "123"
solo está regresando de la lambda. No está configurando una variable para el valor de retorno de la lambda (cuando hace lambda_new.call
, por lo que el valor simplemente se descarta. Luego, se return "456"
el return "456"
y se devuelve de la función. Si, en lugar de devolviendo "456"
, devolvió lambda_new.call
, el valor de retorno de func_two
sería "123"
.
Esta es una de las principales diferencias entre Procs y lambdas.
Un retorno en un Proc vuelve de su bloque / método que lo incluye, mientras que un retorno en un lambda simplemente retorna desde el lambda. Cuando llamas al lambda dentro del func_two, simplemente devuelve su valor en su lugar, que no se guarda.
Lea en Procs v. Lambdas aquí: http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls
Vea la pregunta SO duplicada: ¿Por qué el retorno explícito hace la diferencia en un Proc?
EDITAR:
Para ilustrar aún más esta diferencia, intercambie func_one y func_two por bloques y vea qué sucede:
> begin; lambda { return 1 }.call end
1
> begin; Proc.new { return 1 }.call end
LocalJumpError: unexpected return
...
123
es un valor de la declaración lambda_new.call
, pero no se usa y no aparece.