对于实例方法有一个Object::method_added(name)
方法,你可以重写,类似于“继承”你已经使用:
class test
def self.method_added(name)
puts "method_added(#{name.inspect})"
super
end
end
irb(main):002:0> class Child < Test; def foo; end; end
method_added(:foo)
=> nil
然后,您可以接收名字比较你的方法列表:
Test.instance_methods.include?(name.to_s)
有了类方法这种方法是行不通的(即使你不喜欢的东西class << self
魔法),但乐于助人的家伙知道了答案:http://www.ruby-forum.com/topic/120416:
class Test
def self.singleton_method_added(name)
puts "Class method added #{name.inspect}"
end
end
这只是问题的第一部分,因为您需要知道哪个类定义了方法(它将是自己的)以及方法是新的还是重写的。根据您的需要
class Test
def self.singleton_method_added(name)
if self == Test
puts "My own class method added: #{self.name}.#{name.inspect}"
elsif Test.methods(false).include?(name.to_s)
puts "Class method overriden: #{self.name}.#{name.inspect}"
elsif Test.methods(true).include?(name.to_s)
puts "My parent's class method overriden: #{self.name}.#{name.inspect}"
else
puts "New class method added: #{self.name}.#{name.inspect}"
end
end
end
澄清:你是否试图从'Test'调用'Child'方法? – 2010-11-17 12:58:22
是的。我想知道孩子被忽视的方法。它们都是类方法,而child变量是对类Child的引用。 – 2010-11-17 13:38:34
最简单的方法如何:“'Child.methods(false)&Test.methods(false)'”?问题是:你想什么时候打电话? '继承'被称为过早。 – Arsen7 2010-11-17 15:48:04