在ruby里所有的东西都是实例, 包括类

在ruby里,每一个类都有一个Metaclass。除了Metaclass之外,所有的Object都是instance object.

换言之,在ruby里,[b]你所有能看见的object都是实例[/b]。

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

具体的关系可以看下图:
[img]http://www.iteye.com/upload/attachment/33878/423f6f25-b040-3cc3-8dc2-128b20006ec2.png[/img]

知道了这个,那么就很好理解

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是错误的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值