我在子类定义了一个类变量。 后面又在父类动态创建了一个同名的类变量。 结果子类就不用自己的了,直接引用父类的了。 这种方式推测实现方式是碰到一个类变量,一定会依次查找父类,即使找到了还要找,直到顶级父类才结束。 这样每次访问一个类变量,消耗的就是整个上层继承类都要找一遍,这东西不是拖慢性能吗。
类变量确实会一直往上查找父类,直到找到最早定义的那个变量。最好用类实例变量,就不会有这个问题
class Person
@@sex = 0
def self.sex
@@sex
end
end
class Girl < Person
@@sex = 1
def self.sex
@@sex
end
end
class Boy < Person
@@sex = 2
def self.sex
@@sex
end
end
puts Girl.sex #=》 2
如果换成
@sex
结果就是 1
类变量不属于某一个特定的类,而是属于整个继承链,所以不存在父类的类变量覆盖了子类的类变量这一说法,因为他们根本就是同一个变量,请参见元编程 129 页。