延迟要求 - 未初始化的常量错误

时间:2013-09-17 05:03:17

标签: ruby

我有一个条件位代码,只能在某些条件下加载。这是特定于平台的代码。

module MyGem
  module MyPlatformSpecificThing
    #stuff
  end
end

我目前懒惰地要求这样做的尝试如下:

module MyGem
  class AClass

  def DoSomething
    if thing_is_true
      require 'my_platform_specific_thing.rb'
      MyGem::MyPlatformSpecificThing.init
      #more stuff
    end
    #even more stuff
  end
end

这似乎是一个足够坚实的计划,不幸的是它没有用。此代码导致错误:

uninitialized constant MyGem::MyPlatformSpecificThing (NameError)

堆栈跟踪指示错误的来源是在DoSomething方法中对init的调用。

我不完全确定为什么Ruby会让我适合这里。 我做错了什么,我应该怎么做?

修改

具体来说,我指的是位于here的Platform类。以上内容应该有助于缩小我所指的内容的细节,但是如果有人想要/需要查看我正在使用的特定类/模块。

3 个答案:

答案 0 :(得分:1)

你几乎做对了。请记住,require方法相对于加载路径加载。在制作gem时,您已将gem lib目录添加到加载路径中。将要求更改为:

require 'my_gem/bcm2835'

或者对于PiPiper:

require 'pi_piper/bcm2835'

只有在未设置驱动程序时才会加载。

答案 1 :(得分:0)

您的伪代码有点不完整且令人困惑,但我认为这可能是问题所在。如果我弄错了,那么在必要时看到你的真实代码是完整的可能会有所帮助。

将此回复检查为reference

您的示例显示:

MyGem::MyPlatformSpecificThing.init

但是,该格式应该具有Module :: Class.method。您的示例显示了Module :: Module.method。

错误消息

uninitialized constant

非常具体,因为它将调用识别为常量,而不是类。

答案 2 :(得分:-1)

您指定的错误......

  

未初始化的常量MyGem :: MyPlatformSpecificThing(NameError)

...只有在内部模块(PiPiper :: Bcm2835)从未实际定义时才会出现;如果问题是对模块函数(init)的实际调用,则会出现不同的错误。

我注意到你已在第10行注释了需求,platform.rb:

#require 'bcm2835.rb'

......并在其他地方需要该文件。让我猜一下,这是解决你的问题,不是吗?

再看一下,除非你已经将pi_piper目录添加到$ LOAD_PATH,否则在原始格式中require语句应该失败。尝试将懒惰需求更改为:

require './bcm2835.rb'

但请注意,如果在执行此行之前的任何时候更改工作目录(Dir.chdir),这将无效。