【发布时间】:2010-02-13 16:19:52
【问题描述】:
这里有一些测试代码可以解释我遇到的问题。 Child 类调用 Parent 类的方法。 Parent 的方法之一在 Parent 上定义了一个名为 foo 的新方法。在定义foo 之后,尝试从 Child 类调用它是可行的,但上下文完全不同(我只能访问 Child 的实例变量,而不是 Parent 的)。
我猜测这与 Ruby 的闭包有关。当我调用 编辑:我尝试使用 lambda 和 proc,但它没有任何改变。define_method 时,我是否应该使用块以外的东西?
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的一样。
提前致谢!
【问题讨论】:
-
我从你上面的例子中得到了不同的结果。我的 Child.foo 给出'上下文是父级,@foo 是“childfoo”'
-
这真的很奇怪。我正在运行 Ruby 1.8.7(不是 1.9),所以这可能与差异有关。
-
啊,是的。我目前正在运行 1.9.1。
-
我可以确认差异出现在 1.8.7p174 和 1.9.1 之间。
-
... 并且您在 1.8.7 头部中遇到了问题行为,所以我想说您将不得不转到 1.9 才能使其按预期工作。
标签: ruby metaprogramming