Вот некоторый тестовый код, который объясняет мою проблему.Класс Child вызывает методы класса Parent.Один из методов Родителя определяет новый метод с именем foo
для Родителя.После определения foo
попытка вызова из дочернего класса работает, но контекст совершенно другой (я могу получить доступ только к переменным экземпляра дочернего элемента, а не к родительскому).
Я предполагаю, что это имеетчто-то делать с закрытием Руби.Должен ли я использовать что-то кроме блока, когда я вызываю define_method
? Edit : я пытался использовать лямбду и процедуру, но ничего не изменилось.
class Parent
@foo = 'foo'
def self.existing_method
puts "Calling existing_method, @foo is #{@foo}"
end
def self.define_new_method
self.class.send :define_method, :foo do
context = methods.include?('bar') ? 'child' : 'parent'
puts "Context is #{context}, @foo is #{@foo.inspect}"
end
end
end
class Child
@foo = 'childfoo'
def self.method_missing(*args, &block)
Parent.send args.shift, *args, &block
end
def self.bar
end
end
Child.existing_method # Calling existing_method, @foo is foo
Child.define_new_method
Child.foo # Context is child, @foo is "childfoo"
# (in Ruby 1.9, the context is parent, but
# @foo is still "childfoo")
Parent.foo # Context is parent, @foo is "foo"
Этот результатэто не то, что я хочу.Child.foo
ответ должен совпадать с Parent.foo
.
Заранее спасибо!