在 ruby​​ 模块中调用模块函数

bln*_*tom 1 ruby module

我想调用一个模块函数来定义 ruby​​ 实用程序模块中的常量。但是,当我尝试这样做时,我收到一条错误消息。这是代码和错误:

module M
  ABC = fun

  module_function

  def self.fun
    "works"
  end
end
Run Code Online (Sandbox Code Playgroud)

错误信息:

NameError: undefined local variable or method `fun' for M:Module
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我也尝试过没有self和有M.fun但没有成功......

spi*_*ann 7

只是当你赋值fun给时,方法并没有被定义ABC。只需更改顺序:

module M
  def self.fun
    "works"
  end

  ABC = fun
end

M::ABC
#=> "works"
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢顺序(方法下面的常量),您可能需要考虑让方法本身来记住它的返回值。常见的模式如下所示:

module M
  def self.fun
    @cached_fun ||= begin
      sleep 4     # complex calculation
      Time.now    # return value
    end
  end
end

M.fun
# returns after 4 seconds => 2017-03-03 23:48:57 +0100
M.fun
# returns immediately => 2017-03-03 23:48:57 +0100
Run Code Online (Sandbox Code Playgroud)