在Metaprogramming Ruby中完成“对象模型”一章后,我感到困惑。 一个对象(某个类的实例)的方法与Ruby中它的类的实例方法相同吗? 这听起来很真实。因为我们知道对象的方法存储在它的类中。
class W;end
W.methods == Class.instance_methods # => true
# Also
String.instance_methods == "abc".methods # => true
W
是Class
的一个实例。但如果我重新打开W
并为其定义一个新方法,那就不要混淆了。
class W
def self.foo
"bar"
end
end
W.methods == Class.instance_methods # => false
W
是Class
的实例,而W
的方法是Class
的实例方法。但如果:foo
没有存储在Class
中,而是存储在哪里?
答案 0 :(得分:0)
方法wtf
存储在W
类中,而不是存储在Ruby的Class
类中。
将其视为继承,当您在继承类中定义方法时,它在继承的类中不可用。同样,当您在W
类中定义方法时,它在Class
类中不可用。
在继承类中添加方法时,不会影响继承的类。
虽然我不建议搞乱Ruby的内部Class类,但你可以通过猴子修补它来添加方法:
class Class
def self.wtf
"wtf"
end
end
现在Class.methods.grep /wtf/
会返回添加的方法。