【发布时间】:2014-04-12 22:15:15
【问题描述】:
我有这个元编程场景,它涉及到 Ruby 的一些更精细的特性,我不太确定如何解决。
每个人都可以轻松地编写下面的示例来完成它应该做的事情,但是我需要在超类和派生的子类中动态定义方法。
在示例中,基类有一个动态定义的方法 :foo 并且当然它暴露给子类 B。 但是,当我在子类 B 的实例上调用 :foo 时,我在动态定义的方法中检测到它似乎无法将它从 B 类实例传递到 A 类实例,这当然是我想要的.
有点奇怪的 ruby 也在子类中定义了方法,但无论如何,这就是我想要解决的问题。
有什么线索吗?
class A
def self.some_method method,*_params
puts "#{name}: defining #{method}"
define_method method do |*args|
puts "#{self.class.name}: called #{method}"
super *args unless self.class.instance_methods(false).include?(method)
end
end
end
class B < A
end
A.some_method :foo
B.new.foo
输出
A: defining foo
B: called foo
NoMethodError: super: no superclass method `foo' for #<B:0x007f9eab85bfa0>
【问题讨论】:
-
顺便说一句:我试图避免 method_missing。
标签: ruby exception metaprogramming