and ruby lambda return proc-object

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.