如何在ruby中自动加载一个类

时间:2017-07-27 20:52:48

标签: 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:MyClass.new
end

main

收到错误:uninitialized constant A::B::MyClass (NameError)

如果我按如下方式使用require并删除自动加载代码,则一切都有效。

require 'a/b/myclass' 

1 个答案:

答案 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的上下文中的顶层。