引用模块内的模块级变量

时间:2011-10-21 16:00:52

标签: ruby

我在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)。

那么,这是在上下文中引用模块级变量的正确方法吗?是否有更简单/更惯用的方式?

1 个答案:

答案 0 :(得分:3)

如果模块分散在其他文件上,则需要确保在调用方法之前运行初始化。如果它们在同一个文件中,这应该尽可能保证,但如果你以某种方式拆分它们可能会有麻烦。

我发现你通常可以逃脱这个:

module M
  def self.a
    @a ||= 1
  end
end

如果此变量可能会发生变化,则需要使用mutator方法。 Rails提供的mattr_accessor基本上可以满足您的需求,是ActiveSupport的一部分。