проблема закрытия рубина (не может получить доступ к var) - PullRequest
0 голосов
/ 24 октября 2010
class SomeClass
end

some_local_var = 5

sc = SomeClass.new

def sc.should_work_closure
  puts some_local_var # how can I access "some_local_var", # doesn't this work like a closure ?
end

sc.should_work_closure()

Строка 9: в should_work_closure': undefined local variable or method some_local_var 'для # (NameError) из t.rb: 12

1 Ответ

0 голосов
/ 24 октября 2010

Нет, def не работает как замыкание.

Чтобы сделать sc доступным в def, вы можете сделать его константой, сделать его глобальным (обычно плохая идея) или использовать define_method с блоком (которые являются замыканиями).

Однако, поскольку вы не находитесь внутри класса, а define_method является методом для классов (и модулей), вы не можете просто использовать его. Вы должны использовать class_eval на собственном классе sc, чтобы попасть внутрь класса.

Пример:

class <<sc; self end.class_eval
  define_method(:should_work_closure)
    puts some_local_var
  end
end

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

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