我有一个这样的模块:
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'for Prober:模块(NoMethodError)
答案 0 :(得分:23)
除了可以选择将函数定义为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)
答案 1 :(得分:14)
最简单的方法是将您的方法转换为模块级方法:
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
def self.probe_invoke
也可以,因为在该行运行时,self
是模块定义。
答案 2 :(得分:7)
在这里的答案旁边,您还可以执行以下操作:
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
end
class << self
块也将其中的每个方法定义为模块的实例方法。
(它的功能与按def Prober.mymethod ...
或def self.mymethod ...
定义每个方法的功能相同)
根据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。
BTW:过去使用extend self
而不是将方法包装在class << self
块中更为常见。
我还将上面的代码改编为其他样式指南推荐。
答案 3 :(得分:3)
答案是:
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)
因为否则您将方法定义为模块的实例方法,但实际上您想要静态定义它。