【发布时间】:2013-04-12 12:55:22
【问题描述】:
我不明白为什么在下面的例子中访问模块的类变量会失败:
module M
@@xyz = 123
end
M.class_variables # [:@@xyz]
M.class_variable_get :@@xyz # 123 , so far so good
class C
extend M
end
C.singleton_class.class_variables # [:@@xyz]
C.singleton_class.class_variable_get :@@xyz # NameError:
# uninitialized class variable @@xyz in Class
谁能解释为什么 @@xyz 的类变量在 C 的单例类中突然无法访问/未定义?
更新: 我用不同的 Ruby YARV 版本重新测试了上面的代码,发现它是最新的回归。
更新 2:
在最新一代的 Ruby 中,Module#class_variables 方法的定义发生了变化。
-
Ruby 到 1.9.3 的定义是
class_variables → 数组
返回 mod 中类变量名称的数组。
-
Ruby 2.0.0 最新稳定版
class_variables(inherit=true) → 数组
返回 mod 中类变量名称的数组。这 在任何包含的模块中包含类变量的名称, 除非inherit参数设置为false。
所以在最新的 Ruby 版本中,class_variables 默认返回包含模块的类变量。只是好奇这个功能有什么用,或者它是否仍然与 include 而不是 extend “包含”的模块有关。
谁能解释一下?
【问题讨论】:
-
我从
C.singleton_class.class_variables得到了[]。你是怎么得到结果的? -
你使用什么 Ruby 实现?在我的问题中,我提到它已使用 Ruby 1.9.3 和 2.0.0 进行了测试。 Sawa 莫名其妙地抹掉了这张纸条。 真丢脸,sawa ;)
-
我正在使用
C:\>ruby -v ruby 1.9.3p374 (2013-01-15) [i386-mingw32] -
@RubyLovely 这很奇怪。我使用系统安装中的 Ruby 2.0.0p0 和 rbenv(用户安装)中的 Ruby 1.9.3p392。 Linux x86_64。
标签: ruby