我有一个这样的模块:
module Prober
def probe_invoke(type, data = {})
p = Probe.new({:probe_type => type.to_s,
:data => data.to_json, :probe_status => 0, :retries => 0})
p.save
end
end我正试图从我的主程序中获得这样的信息:
require 'prober'
Prober.probe_invoke("send_sms", sms_text)但是它会产生错误:
未定义方法`probe_invoke‘用于Prober:模块(NoMethodError)
发布于 2011-06-01 08:54:16
除了为您提供将函数定义为self.的选项之外,您还可以选择包含模块并在没有模块引用的情况下调用它,如下所示:
module Prober
def probe_invoke(type, data = {})
p = Probe.new({:probe_type => type.to_s,
:data => data.to_json, :probe_status => 0, :retries => 0})
p.save
end
end你可以这样称呼它:
require 'prober'
include Prober
probe_invoke("send_sms", sms_text)发布于 2011-06-01 08:39:36
在这里的答案旁边,您还可以执行以下操作:
module Prober
class << self
def probe_invoke(type, data = {})
p = Probe.new({:probe_type => type.to_s,
:data => data.to_json, :probe_status => 0, :retries => 0})
p.save
end
# more module instance methods ...
end
endclass << self块还将其中的每个方法定义为模块的实例方法。
(它的功能类似于通过def Prober.mymethod ...或def self.mymethod ...定义每个方法)
更新(2014-11-22)
根据Ruby指南,您可以选择should use module_function:
module Prober
module_function # <-- preferred style nowadays
def probe_invoke(type, data = {})
Probe.new(probe_type: type.to_s,
data: data.to_json,
probe_status: 0,
retries: 0)
.save # no need for a temporary variable
end
# more module methods ...
end我把这叫做utility modules。
顺便说一句:在过去,使用extend self而不是将方法包装在class << self块中更为常见。
我还修改了上面的代码,以适应其他风格的指南建议。
发布于 2011-06-01 07:23:46
答案是:
module Prober
def Prober.probe_invoke(type, data = {})
p = Probe.new({:probe_type => type.to_s,
:data => data.to_json, :probe_status => 0, :retries => 0})
p.save
end
end
Prober.probe_invoke("send_sms", sms_text)否则,您将该方法定义为模块的实例方法,但实际上您希望静态地定义它。
https://stackoverflow.com/questions/6197578
复制相似问题