在ruby模块中调用模块函数

时间:2017-03-03 22:18:31

标签: ruby module

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

module M
  ABC = fun

  module_function

  def self.fun
    "works"
  end
end

错误讯息:

NameError: undefined local variable or method `fun' for M:Module

有什么想法吗?我也尝试了selfM.fun,但没有成功......

2 个答案:

答案 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

在您的代码中,您在定义之前使用了该方法。