关于 Ruby 类变量(class variables)的疑惑

2013-12-16 23:49:29 +08:00
 tang3w
贴上代码:
https://gist.github.com/tang3w/7989266
运行结果:
warning: class variable access from toplevel
2

版本是 Ruby 2.0
我想问的是,为什么输出的是 2 而不是 1
2944 次点击
所在节点    程序员
6 条回复
toctan
2013-12-17 00:51:22 +08:00
由于没有指定 scope, @@a = 2 直接定义在 Object 上, 而 class variable 是由基类和继承类共享的,所以运行结果是 2,看下面

https://gist.github.com/toctan/7990091

另外,Ruby 的 class variable 有很多神奇的地方,很多人都建议避免使用,其实,基本上也不会怎么用到:
http://makandracards.com/makandra/14229-the-many-gotchas-of-ruby-class-variables
http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/
ShiningRay
2013-12-17 02:10:09 +08:00
所以一般是用类自身的实例变量
tang3w
2013-12-17 11:08:20 +08:00
我知道类变量的行为很奇怪,坑也比较多,但是不想逃避这一关,最终还是想弄懂它。

@toctan 恩,谢谢你的解释。但是仍然让我疑惑的是:为什么 class A 中的 @@a 会被 Object 中的 @@a 覆盖?是不是给 Object 中的 @@a 赋值后,这个类变量就转移到 Object 中了?我知道类变量是在类和子类(继承体系)中共享,但是这个共享的规则也太奇怪了。
fwee
2013-12-17 11:58:02 +08:00
@tang3w 是很奇怪啊,所以《ruby编程语言》中建议不要用,还有人提过issue建议删掉这个功能,你既然知道这个规则奇怪就代表你已经弄懂了,就是这么奇怪
dalang
2013-12-17 12:35:09 +08:00
@tang3w 正是因为在继承关系中class variable的不符合常理的行为,才导致很多人不建议使用ruby的类变量。
至少我遇到的情况,在考虑用类变量的时候,类class instance variable总会是更好的选择。
tang3w
2013-12-17 21:19:11 +08:00
@fwee
@dalang

谢谢你们,通过阅读源码,我搞清楚了 Ruby 2.0 中查找类变量的逻辑。
总的来说,是逐一遍历祖先链,取最上游的类变量。

结贴。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/93433

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX