我在ruby中引用模块级变量时遇到了一些困难。说我有这样的情况,我在内部指的是M.a:
module M
@@a=1
def self.a
@@a
end
class A
def x
M.a
end
end
end
现在,这个例子对我来说很好但是它在一个稍微复杂的上下文中失败了(模块分布在本地gem中安装的许多文件中 - 但我的理解是这不应该影响方式代码被执行),出现如下错误:未定义的方法`a'代表M :: M(NoMethodError)。
那么,这是在上下文中引用模块级变量的正确方法吗?是否有更简单/更惯用的方式?
答案 0 :(得分:3)
如果模块分散在其他文件上,则需要确保在调用方法之前运行初始化。如果它们在同一个文件中,这应该尽可能保证,但如果你以某种方式拆分它们可能会有麻烦。
我发现你通常可以逃脱这个:
module M
def self.a
@a ||= 1
end
end
如果此变量可能会发生变化,则需要使用mutator方法。 Rails提供的mattr_accessor
基本上可以满足您的需求,是ActiveSupport的一部分。