我有一个条件位代码,只能在某些条件下加载。这是特定于平台的代码。
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类。以上内容应该有助于缩小我所指的内容的细节,但是如果有人想要/需要查看我正在使用的特定类/模块。
答案 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),这将无效。