我想调用一个模块函数来定义 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但没有成功......
只是当你赋值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)