首页 > 解决方案 > 在 ruby​​ 模块中分配常量

问题描述

我有一个模块:

module Foo
  module Bar
    TEST = "ok"

    def self.is_ok; true end
  end
end

Foo::Bar::TEST # => "ok"
Foo::Bar.is_ok # => true

我想在定义的模块中有另一个常量,只有一次。

我试过这样:

module Foo
  module Bar
    TEST = is_ok

    def self.is_ok; true end
  end
end

然后我得到一个错误说undefined local variable or method 'is_ok' for Foo::Bar:Module。这意味着is_ok尚未定义。

常量是否在模块类方法之外的某个时间点定义?

此外,我还有另一个例子:

module Foo
  module Bar
    TEST = "ok"

    def self.is_ok; true end
  end

  module YYY
    TEST = Foo::Bar::TEST
    TEST2 = Foo::Bar.is_ok
  end
end

在这里,我得到:

Foo::Bar::TEST2 # => true

正如预期的那样。

标签: ruby

解决方案


这只是定义顺序的问题:

module Foo
  module Bar
    def self.is_ok
      true
    end
    TEST = is_ok
  end
end

完全按照您的预期工作。

原因很简单,Ruby 类定义是逐行评估的。TEST在您的示例中分配的时间::is_ok尚未定义!


推荐阅读