我有一个模块如下
module A; module B
class MyClass
puts 'inside myclass'
end
end end;
现在我想从根目录中的文件自动加载上面的类。 文件名:dostuff
def main
autoload A::B:MyClass,'a/b/myclass.rb' #path is correct , getting error here
c = A::B:MyClass.new
end
main
收到错误:uninitialized constant A::B::MyClass (NameError)
如果我按如下方式使用require并删除自动加载代码,则一切都有效。
require 'a/b/myclass'
答案 0 :(得分:1)
你对自动加载器的要求太高了。它实际上一次只能处理一个级别。这意味着您需要在单独的文件中表达每个模块或类:
# a.rb
module A
autoload(:B, 'a/b')
end
# a/b.rb
module A::B
autoload(:MyClass, 'a/b/my_class')
end
# a/b/my_class.rb
class A::B::MyClass
end
然后你可以自动加载A:
autoload(:A, 'a')
A::B::MyClass.new
在Ruby中拥有main
函数也非常不寻常。通常,您只需将代码置于已调用main
的上下文中的顶层。