您的位置:首页 > 其它

一个程序引起的思考

2010-08-24 23:18 288 查看
在ruby里,每一个类都有一个Metaclass。除了Metaclass之外,所有的Object都是instance object.

换言之,在ruby里,你所有能看见的object都是实例

首先,在ruby中,如何知道一个object是一个类还是这个类的实例呢?很简单,如果有object的klass指向它,那么他就是我们传统所说的'类', 而如果一个object的klass指向别人那么就是传统所说的'实例'. 为什么要加传统呢?因为在ruby里,一个object即可以是'类',也可以是'实例'。也就是说既有一个object的klass指向它,而它的klass又指向别人。所以即使是传统意义的'类',也是metaclass的实例。而metaclass是不可见的,所以在ruby里所有的object都是一个'实例', 只有metaclass才是真正的纯'类'。这不禁让我觉得以往面向对象里所定义的'类','实例'在ruby面前被扭曲了,甚至觉得词汇定义的贫乏。

具体的关系可以看下图:



知道了这个,那么就很好理解
class T1
@v1 = 'abc'
def get_v1
return @v1
end

def self.get_v1
return @v1
end
end

i1 = T1.new
puts i1.get_v1  #返回空,而不是'abc'
puts T1.get_v1  #这个才是返回'abc'

因为这里@v1是T1这个实例的变量,而不是ins1这个实例的变量,这是两个完全不相干的实例,如果我不追加定义self.get_v1的话T1里根本就没有get_v1这个方法,所以你调用T1.get_v1是错误的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: