gpt4 book ai didi

ruby - 扩展模块和类变量访问?

转载 作者:数据小太阳 更新时间:2023-10-29 06:47:03 24 4
gpt4 key购买 nike

我无法理解为什么在以下示例中访问模​​ block 的类变量失败:

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

谁能解释为什么类变量 @@xyzC 的单例类中突然无法访问/未定义?

更新:我用不同的 Ruby YARV 版本重新测试了上面的代码,发现它是最新的回归。

更新 2:

在最新一代的 Ruby 中,Module#class_variables 方法的定义发生了变化。

  • Ruby up to 1.9.3 的定义是

    class_variables → 数组

    返回 mod 中类变量名称的数组。

  • Ruby 2.0.0 最新稳定版

    class_variables(inherit=true) → 数组

    返回 mod 中类变量名称的数组。这个在任何包含的模块中包含类变量的名称,除非 inherit 参数设置为 false。

因此在最新的 Ruby 化身中,class_variables 默认情况下也返回包含模块的类变量。只是好奇此功能的用途是什么,或者它是否仍然涉及使用 include 而不是 extend “包含”的模块。

谁能解释一下?

最佳答案

不确定这些是否是答案,但我确实找到了这些

C::M.class_variables #=> ["@@xyz"]
# (but gives "warning: toplevel constant M referenced by C::M")

class D
include M
end
D.class_variables #=> ["@@xyz"]

(这来自 Ruby 1.8.7,现在没有更高版本)。

include 使模块的实例方法成为类的实例方法。根据 Pickaxe 的说法,“这几乎就像模块变成了使用它的类的父类(super class)”。

与此同时,extend 旨在将模块的方法添加到对象;在类定义中调用时,它等同于 self.extend。看起来它们并不等同。

HTH.

关于ruby - 扩展模块和类变量访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16099395/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com