2013-12-16 264 views
1

我包含了别人的模块,它似乎被分割成多个文件。它看起来是这样的:无法从模块访问方法?

alfred.rb:

require 'alfred/ui' 

module Alfred 
    <code> 
end 

阿尔弗雷德/ ui.rb:

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

我想从我的代码,其中有require "alfred"访问info方法在顶部,使用以下语法:

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

这是不工作,一个d的结果为#<NameError: uninitialized constant Alfred::Logger>

其次,我会喜欢,如果有人能解释如何如何精确地“构造”一个​​模块,这是一个模块,这是跨越这样的几个文件分割。 alfred/ui.rb的代码是否包含在alfred.rb末尾的require行的开头?它是否都以某种其他方式组合起来?也许它并不重要,但它似乎会帮助我更好地包围它。

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

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

+0

我得到另一个错误'NoMethodError:未定义的方法'信息为Alfred :: Logger:Class'。你从哪里打这个电话? –

+0

但是在guthub回购中,我没有看到'Alfred'模块内'Logger'类的定义。我只有'类LogUI <:: Logger' ...尝试'Alfred :: LogUI.info(“我的消息”)' –

+0

哦,有趣的是,它看起来像自上次下载它以来,类已经更新。我会下载最新的,并且当我今晚在家时给那个镜头。 – ebarrere

回答

0

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

如果它已被定义就像一个类方法:

​​

,那么你将能够把它作为你尝试。

+0

对于您的代码,您可以尝试如下所示:'@my_logger = Alfred :: Logger.new'在代码顶部,然后通过'@my_logger.info“foo!”' –

+0

啊,感谢您的解释。我的脑袋里倒过来了实例/类的方法。但是,我仍然无法使用您提供的语法来实例化记录器。与以前一样,我得到了与未初始化的常量Alfred :: Logger相同的错误。有关于此的任何想法? – ebarrere