【问题标题】:Trouble accessing method from module?无法从模块访问方法?
【发布时间】:2013-12-16 01:59:38
【问题描述】:

我包含了其他人的模块,它似乎被拆分为多个文件。它看起来像这样:

阿尔弗雷德.rb:

require 'alfred/ui'

module Alfred
  <code>
end

阿尔弗雷德/ui.rb:

module Alfred
  class Logger
    def info(msg)
      logger.info msg
    end
  end
end

我正在尝试使用以下语法从我的代码中访问 info 方法,该方法顶部有 require "alfred"

Alfred::Logger.info("my message")

这不起作用,并导致#&lt;NameError: uninitialized constant Alfred::Logger&gt;

其次,如果有人可以解释 Ruby 如何准确地“构建”一个像这样拆分为多个文件的模块,我会很高兴。来自alfred/ui.rb 的代码是否包含在alfred.rb 的末尾require 行的开头?这一切是否以其他方式组合在一起?也许这甚至无关紧要,但它似乎可以帮助我更好地理解它。

我正在使用的模块的完整代码是at Github,以防有人感兴趣。

有人可以帮助解释为什么我不能以这种方式使用该方法,以及可以做些什么来解决它?

【问题讨论】:

  • 我收到另一个错误 NoMethodError: undefined method info' 对于 Alfred::Logger:Class`。您从哪里拨打电话?
  • 但在 Guthub 存储库中,我没有看到 Alfred 模块内的 Logger 类的定义。我只看到class LogUI &lt; ::Logger...试试Alfred::LogUI.info("my message")
  • 哦,有趣,自从我上次下载以来,该课程似乎已更新。我会下载最新的,今晚在家的时候试一试。

标签: ruby module nameerror


【解决方案1】:

#info 是一个 instance 方法,这意味着它只存在于 Logger 类的实例上。如果你想直接从你的代码中调用它,你会调用Alfred::Logger.new.info "some message",但这似乎有点奇怪。通常这种类型的东西由库内部使用。

如果它被定义为类方法:

module Alfred   
  class Logger   
    def self.info(msg)  
      logger.info msg   
    end   
  end
end  

那么您就可以在尝试时调用它。

【讨论】:

  • 对于您的代码,您可以尝试这样的操作:@my_logger = Alfred::Logger.new 在代码的顶部,然后在整个执行 @my_logger.info "foo!"
  • 啊,谢谢你的解释。我在脑海中颠倒了实例/类方法。但是,我仍然无法使用您提供的语法来实例化记录器。我得到与以前相同的uninitialized constant Alfred::Logger 错误。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 2021-02-05
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
相关资源
最近更新 更多