2012-11-24 95 views
-2

在完成元编程Ruby中的“对象模型”一章后,我感到困惑。 对象(某个类的实例)的方法与Ruby中它的类的实例方法是否相同? 听起来不错。因为我们知道存储在其类中的对象的方法。是一个对象(某个类的实例)的方法与Ruby中它的类的实例方法相同吗?

class W;end 

W.methods == Class.instance_methods # => true 

# Also 

String.instance_methods == "abc".methods # => true 

WClass一个实例。但如果我重新打开W并为它定义一个新的方法,比混淆。

class W 
    def self.foo 
    "bar" 
    end 
end 

W.methods == Class.instance_methods # => false 

WClass一个实例,并W的方法是Class的实例方法。但是如果:foo未存储在Class中,那么它比存储在哪里?

回答

0

方法wtf存储在W类中,而不存储在Ruby的Class类中。

把它看作是继承,当你在继承类中定义一个方法时,它在继承类中是不可用的。同样,当您在W类中定义方法时,它在Class类中不可用。 在继承类中添加方法时,不会影响继承的类。

虽然我不建议使用Ruby的内部Class类搞乱,你可以通过猴子修补它添加方法是:

class Class 
    def self.wtf 
    "wtf" 
    end 
end 

现在Class.methods.grep /wtf/将返回添加的方法。

+0

-1。这是错误的。 'wtf'不存储在'W'类中,它存储在'W'类对象的单例类中。 –

+0

我想我误解了对象和类,现在我得到这个,'W'是_Class_的对象,'Class'也是_Class_的对象。他们是不同的对象。他们有相同的方法,因为他们是_Class_的对象,如果我向W添加一个方法,它会像@JörgWMittag所说的那样添加到W类对象的单例类。而这种类型的方法是单例方法。我刚刚发现,在ruby中我们可以定义一个像'def obj.method; end'这样的方法。 – DouO

相关问题