首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby ::NoMethodError

Ruby ::NoMethodError
EN

Stack Overflow用户
提问于 2011-06-01 07:18:44
回答 3查看 23.6K关注 0票数 32

我有一个这样的模块:

代码语言:javascript
复制
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

我正试图从我的主程序中获得这样的信息:

代码语言:javascript
复制
require 'prober'
Prober.probe_invoke("send_sms", sms_text)

但是它会产生错误:

未定义方法`probe_invoke‘用于Prober:模块(NoMethodError)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-01 08:54:16

除了为您提供将函数定义为self.的选项之外,您还可以选择包含模块并在没有模块引用的情况下调用它,如下所示:

代码语言:javascript
复制
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

你可以这样称呼它:

代码语言:javascript
复制
require 'prober'
include Prober
probe_invoke("send_sms", sms_text)
票数 25
EN

Stack Overflow用户

发布于 2011-06-01 08:39:36

在这里的答案旁边,您还可以执行以下操作:

代码语言:javascript
复制
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 ...定义每个方法)

更新(2014-11-22)

根据Ruby指南,您可以选择should use module_function

代码语言:javascript
复制
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块中更为常见。

我还修改了上面的代码,以适应其他风格的指南建议。

票数 7
EN

Stack Overflow用户

发布于 2011-06-01 07:23:46

答案是:

代码语言:javascript
复制
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)

否则,您将该方法定义为模块的实例方法,但实际上您希望静态地定义它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6197578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档