Будет работать как есть, если вы сделаете что-то вроде:
GlobalMemory.init {
self.val3 = 'value'
}
В противном случае он неотличим от объявления локальной переменной. Я думаю, что лучший способ сделать это было бы иметь параметр блока и написать свой метод init следующим образом:
GlobalMemory.init { |g|
g.val1 5
g.val2 "some string"
g.val3 = 'yeah'
}
Я немного возился с попыткой заставить решение var1 = работать с использованием #local_variables, но самое близкое, что я мог бы сделать, это:
class Foo
def initialize(&bl)
@data = {}
b = yield self
still_to_assign = eval('local_variables', b) - eval('local_variables', bl)
still_to_assign.each { |v| r = eval(v,b); @data[v] = r }
end
end
Foo.new {
one = 1
two = 2
three = 3
binding
}
Как вы можете видеть, это требует, чтобы вы возвращали объект привязки в конце вашего блока. У него также есть некоторые проблемы с переменными, которые уже были объявлены до блока. Может быть, кто-то может предложить лучший способ сделать это?