ruby functional-programming

lambda ruby



Diferencias entre Proc y Lambda (1)

Ruby tiene diferencias entre Procs creados a través de Proc.new y lambda (o el operador ->() en 1.9). Parece que Procs no-lambda salpicará una matriz pasada a través de los argumentos del bloque; Procs creados a través de lambda no lo hacen.

p = Proc.new { |a,b| a + b} p[[1,2]] # => 3 l = lambda { |a,b| a + b } l[[1,2]] # => ArgumentError: wrong number of arguments (1 for 2)

¿Alguien tiene alguna idea de las motivaciones detrás de este comportamiento?


Existen dos diferencias principales entre los procesos lambdas y los no lambda:

  1. Al igual que los métodos, los lambdas regresan de sí mismos, mientras que los procesos sin lambda regresan del método de cierre, al igual que los bloques.
  2. Al igual que los métodos, los lambdas tienen una estricta comprobación de argumentos, mientras que los procedimientos no lambda tienen una comprobación de argumentos sueltos, al igual que los bloques.

O, en resumen: los lambdas se comportan como métodos, los procesos no-lambda se comportan como bloques.

Lo que estás viendo es una instancia de # 2. Inténtalo con un bloque y un método además de un Proc no-lambda y un lambda, y verás. (Sin este comportamiento, Hash#each sería un PITA real para usar, ya que produce una matriz con dos elementos, pero casi siempre querrá tratarlo como dos argumentos).