Замыкания в Ruby

У меня небольшие проблемы с закрытиями, и я хотел бы знать, что эквивалентный код для канонической процедуры Make-adder будет находиться в Рубин.

в схеме это будет так:

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

4 ответов


это на самом деле очень близко...

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

в 1.9 вы можете использовать...

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

одно отличие заключается в том, что в то время как схема имеет только один вид процедуры, Ruby имеет четыре. В большинстве случаев они ведут себя достаточно похоже на вашу стандартную лямбду, но вы должны попытаться понять все детали в глубине.


вот еще один способ сделать это в 1.9:

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

вот довольно хороший экран-cast, объясняющий блоки и закрытия в Ruby: http://www.teachmetocode.com/screencasts/8