Ruby 类变量性能问题

hgyxbll · 2013年12月21日 · 最后由 hgyxbll 回复于 2013年12月24日 · 2400 次阅读

我在子类定义了一个类变量。 后面又在父类动态创建了一个同名的类变量。 结果子类就不用自己的了,直接引用父类的了。 这种方式推测实现方式是碰到一个类变量,一定会依次查找父类,即使找到了还要找,直到顶级父类才结束。 这样每次访问一个类变量,消耗的就是整个上层继承类都要找一遍,这东西不是拖慢性能吗。

你为什么要这么做?什么应用场景?

#1 楼 @miclle 我的意思是使用类变量的性能不好,因为没碰到一个类变量就会查找整个继承系,中间即使找到也不停下来

后面又在父类动态创建了一个同名的类变量。

类变量在继承体系里面只有一个,后定义的有效,你想的可能是类实例变量。

类变量确实会一直往上查找父类,直到找到最早定义的那个变量。最好用类实例变量,就不会有这个问题

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

项目中我还没有用到过类变量。。

👍 这些性能瓶颈的地方我们都会改成汇编写

profile 出来有性能问题的才算性能问题。循环里面慢才是真的慢,你弄一个慢的例子。。。

类变量不属于某一个特定的类,而是属于整个继承链,所以不存在父类的类变量覆盖了子类的类变量这一说法,因为他们根本就是同一个变量,请参见元编程 129 页。

#8 楼 @sallon88 在父类如果没有定义类变量是不能访问子类的类变量的,这时候如果动态创建一个父类的类变量,我觉得代码里不会去查找子类有没有这个变量,而是直接定义一个新的,这样简单。所以我说是覆盖。 其实类变量应该在子类定义相同类变量时候就丢弃父类的,因为子类有权利这么做,如果子类想用父类的就不要定义,这多好啊

#7 楼 @linjunhalida 是啊,但是类变量如果不是这样定义就没必要花那个总是循环一遍的时间了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号