2009-11-28 18 views
12

Tengo un pequeño problema con los cierres y me gustaría saber qué el código equivalente para el procedimiento canonical make-sumador sería en Ruby.Cierres en Ruby

En el esquema sería como:

(define (make-adder n) 
(lambda (x) (+ x n)) 

Respuesta

17

Es realmente muy cerca ...

def make_addr n 
    lambda { |x| x + n } 
end 
t = make_addr 100 
t.call 1 
101 

En 1.9 se puede utilizar ...

def make_addr n 
    ->(x) { x + n } 
end 
+0

muchas gracias, que despejó mis dudas. – burlsm

3

Una diferencia es que mientras Scheme tiene solo un tipo de procedimiento, Ruby tiene cuatro. La mayoría de las veces, se comportan de manera similar a su lambda estándar, pero debe intentar understand all the details in depth.

2

Ésta es otra manera de hacerlo en 1,9:

make_adder = -> n, x { n + x } 
hundred_adder = make_adder.curry[100] 
hundred_adder[4] # => 104