У меня небольшие проблемы с замыканиями, и я хотел бы знать, что эквивалентный код для канонической процедуры make-adder будет в Рубин.
На схеме это будет выглядеть так:
(define (make-adder n) (lambda (x) (+ x n))
Это на самом деле очень близко ...
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
Одно отличие состоит в том, что, хотя в Scheme есть только один вид процедур, в Ruby есть четыре. В большинстве случаев они ведут себя так же, как ваша стандартная лямбда, но вы должны попытаться понять все подробности .
Вот еще один способ сделать это в 1.9:
make_adder = -> n, x { n + x } hundred_adder = make_adder.curry[100] hundred_adder[4] # => 104
Вот довольно хороший скриншот, объясняющий блоки и закрытия в Ruby: http://www.teachmetocode.com/screencasts/8