Затворы в рубине - PullRequest
       38

Затворы в рубине

12 голосов
/ 28 ноября 2009

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

На схеме это будет выглядеть так:

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

Ответы [ 4 ]

17 голосов
/ 28 ноября 2009

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

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
3 голосов
/ 28 ноября 2009

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

2 голосов
/ 28 ноября 2009

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

make_adder = -> n, x { n + x }
hundred_adder = make_adder.curry[100]
hundred_adder[4] # => 104
0 голосов
/ 28 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...