我不明白为什么在以下示例中访问模块的类变量会失败:
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:
Module#class_variables
在最新一代的 Ruby 中,方法的定义发生了变化。
Ruby 到 1.9.3 的定义是
类变量→ 数组
返回 mod 中类变量名称的数组。
Ruby 2.0.0 最新稳定版
class_variables(inherit=true) → 数组
返回 mod 中类变量名称的数组。这包括任何包含模块中的类变量的名称,除非继承参数设置为 false。
因此,在最新的 Ruby 版本中,class_variables
默认情况下还返回包含模块的类变量。只是好奇这个功能有什么用,或者它是否仍然与“包含”include
和不“包含”的模块有关extend
。
谁能解释一下?