如何在ruby中自动加载类
我有一个模块如下 -类MyClass lib/a/b/MyClass.rb的路径如何在ruby中自动加载类,ruby,autoload,Ruby,Autoload,我有一个模块如下 -类MyClass lib/a/b/MyClass.rb的路径 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:My
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
Am获取错误:未初始化常量A::B::MyClass NameError
如果我使用如下所示的require并删除自动加载代码,则一切正常
require 'a/b/myclass'
你对自动加载器要求太高了。它一次只能处理一个级别。这意味着您需要在单独的文件中表达每个模块或类:
# 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
然后,您可以自动加载:
autoload(:A, 'a')
A::B::MyClass.new
在Ruby中拥有一个主函数也是非常不传统的。通常,您只需将代码放在已被称为main的上下文的顶层。Myclass或Myclass?加载路径中是否有lib?请忽略拼写错误。如果我使用require'a/b/myclass'加载模块,那么一切都正常。但我想用autoload还有其他原因。lib在我的加载路径中。@SergioTulentsev你能帮我解决这个问题吗?:谢谢回答。但是为什么我不能从main自动加载A::B::MyClass?创建模块时只将样板文件自动加载到下一个嵌套模块是一种浪费。还有其他解决方法吗?这是因为在代码中引用的是A::B,而A::B还不存在,所以它爆炸了。虽然这看起来像是一团糟,但它更为传统,使组织代码更容易。这就是人们期望您的库在文件系统上的布局方式。