我想调用一个模块函数来在ruby中的实用程序模块中定义一个常量。但是,当我尝试这个时,我收到一条错误消息。这里是代码和错误:
module M
ABC = fun
module_function
def self.fun
"works"
end
end
错误讯息:
NameError: undefined local variable or method `fun' for M:Module
有什么想法吗?我也尝试了self
和M.fun
,但没有成功......
答案 0 :(得分:3)
当您将fun
分配给ABC
时,不会定义该方法。只需更改顺序:
module M
def self.fun
"works"
end
ABC = fun
end
M::ABC
#=> "works"
如果您不喜欢该命令(方法下面的常量),您可能需要考虑让方法本身记住它的返回值。常见的模式如下:
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
答案 1 :(得分:1)
在irb
控制台中测试:
$ irb
2.3.3 :001 > module M
2.3.3 :002?> def self.fun
2.3.3 :003?> "worked"
2.3.3 :004?> end
2.3.3 :005?>
2.3.3 :006 > ABC = fun
2.3.3 :007?> end
=> "worked"
2.3.3 :008 > M
=> M
2.3.3 :009 > M::ABC
=> "worked"
2.3.3 :010 >
事实是,现在您在使用之前定义了self.fun
。
在您的代码中,您在定义之前使用了该方法。