(Большое изменение, я получил часть пути там ...) Я взломал прочь, и я придумал это как способ указать, что нужно сделать перед тем атрибуты чтения:Настройка attr_reader для создания ленивого создания атрибутов
class Class
def attr_reader(*params)
if block_given?
params.each do |sym|
define_method(sym) do
yield
self.instance_variable_get("@#{sym}")
end
end
else
params.each do |sym|
attr sym
end
end
end
end
class Test
attr_reader :normal
attr_reader(:jp,:nope) { changethings if @nope.nil? }
def initialize
@normal = "Normal"
@jp = "JP"
@done = false
end
def changethings
p "doing"
@jp = "Haha!"
@nope = "poop"
end
end
j = Test.new
p j.normal
p j.jp
Но changethings
не распознается как метод - кто есть какие-нибудь идеи?
Похоже, мой attr_reader блок выполняется в рамках объекта класса, а не его экземпляр. Какие-нибудь идеи о том, как заставить это к экземпляру? –
Вы можете использовать 'instance_eval' вместо yield, с блоком в качестве параметра. Но это немного пахнет. –