1

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

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 在这里适合我。我做错了什么,我应该怎么做?

编辑:

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

4

3 回答 3

1

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

require 'my_gem/bcm2835'

或者对于 PiPiper:

require 'pi_piper/bcm2835'

这应该仅在未设置驱动程序时加载。

于 2013-09-21T09:01:04.760 回答
0

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

检查此响应作为参考

您的示例显示:

MyGem::MyPlatformSpecificThing.init

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

错误信息

uninitialized constant

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

于 2013-09-20T22:08:15.140 回答
-1

您指定的错误...

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

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

我注意到您已经在第 10 行 platform.rb 上注释掉了 require:

#require 'bcm2835.rb'

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

再看一下,原始形式的 require 语句应该已经失败,除非您已经将 pi_piper 目录添加到 $LOAD_PATH。尝试将惰性要求更改为:

require './bcm2835.rb'

但请注意,如果您在执行此行之前的任何时候更改工作目录 (Dir.chdir),这也不起作用。

于 2013-09-21T05:31:02.623 回答