Ruby-模块:: NoMethodError

问题描述

| 我有一个像这样的模块:
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)     

解决方法

        除了为您提供将函数定义为
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)
    ,        最简单的方法是将您的方法转换为模块级方法:
module Prober
  def Prober.probe_invoke(type,:retries => 0})
    p.save
  end
end
def self.probe_invoke
也将起作用,因为在该行运行时,
self
是模块定义。     ,        在此处的答案旁边,您还可以执行以下操作:
module Prober
  class << self
    def probe_invoke(type,data = {})
      p = Probe.new({:probe_type => type.to_s,:retries => 0})
      p.save
    end

    # more module instance methods ...
  end
end
“ 9”块还将其中的每个方法都定义为模块的实例方法。 (它的功能就像用
def Prober.mymethod ...
def self.mymethod ...
定义每个方法一样) 更新(2014-11-22) 根据《 Ruby Style Guide》,您应该改用
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
我将其称为实用程序模块。 顺便说一句:过去,通常使用
extend self
而不是将方法包装在
class << self
块中。 我还将上面的代码调整为其他样式指南建议。     ,        答案是:
module Prober
  def Prober.probe_invoke(type,:retries => 0})
    p.save
  end
end

Prober.probe_invoke(\"send_sms\",sms_text)
因为否则您将方法定义为模块的实例方法,但实际上您想静态定义它。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...