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

在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面前被扭曲了,甚至觉得词汇定义的贫乏。

具体的关系可以看下图:
在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是错误的。

你可能感兴趣的:(Ruby)