Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ruby中自动加载类_Ruby_Autoload - Fatal编程技术网

如何在ruby中自动加载类

如何在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

我有一个模块如下

-类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
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还不存在,所以它爆炸了。虽然这看起来像是一团糟,但它更为传统,使组织代码更容易。这就是人们期望您的库在文件系统上的布局方式。