Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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_Require - Fatal编程技术网

Ruby:如何安全地同时要求目录中的所有类?

Ruby:如何安全地同时要求目录中的所有类?,ruby,require,Ruby,Require,在Ruby中,我可以同时要求目录中的所有类文件: Dir["/path/to/directory/*.rb"].each {|file| require file } 但是如果类具有继承关系呢?如何避免在超类之前要求子类?(或者这是不可能的?事实上,如果您将所有文件命名为与类名相对应的文件,那么就存在一个肮脏的黑客行为。但这种方法只有在不同类之间有继承关系时才有效不考虑多次重写方法 假设您在需要的目录中有两个rb文件:engineer.rb和human.rb --工程师.rb 在另一个需要它们

Ruby
中,我可以同时要求目录中的所有类文件:

Dir["/path/to/directory/*.rb"].each {|file| require file }

但是如果类具有继承关系呢?如何避免在超类之前要求子类?(或者这是不可能的?

事实上,如果您将所有文件命名为与类名相对应的文件,那么就存在一个肮脏的黑客行为。但这种方法只有在不同类之间有继承关系时才有效不考虑多次重写方法

假设您在需要的目录中有两个rb文件:engineer.rb和human.rb

--工程师.rb

在另一个需要它们的文件中,如果您首先指定工程师,您将得到一个错误:

require 'engineer' #=> uninitialized constant Human (NameError)
require 'human'
因此,我们可以简单地使用强大的武器自动加载

Dir['/path/to/directory/*.rb'].each do |f|
  module_name = /\/([^\/\.]+?)\.rb$/.match(f)[1].capitalize.to_sym
  autoload(module_name, f)
end

#=> autoload :Engineer, 'engineer'
#=> autoload :Human, 'human'

puts Engineer.new #=> #<Engineer:0x007f91728847e8>
Dir['/path/to/directory/*.rb']|
模块名称=/\/([^\/\.]+?)\.rb$/.match(f)[1]。大写。to\u符号
自动加载(模块名称,f)
结束
#=>自动加载:工程师,“工程师”
#=>自动加载:人类,“人类”
puts Engineer.new#=>#
基本上,自动加载将需要按需文件,因此要求的顺序不再是一个问题

如果您想了解有关自动加载的更多信息,请点击此处:

但请注意,自动加载很快就会死掉(因为它不是线程安全的),请参阅此处(由Matz提供):

如果文件本身是正确的
需要依赖关系,那么一切都会好起来,否则就是轮盘赌。那么您是否尝试过自动加载,它对您有效?
require 'engineer' #=> uninitialized constant Human (NameError)
require 'human'
Dir['/path/to/directory/*.rb'].each do |f|
  module_name = /\/([^\/\.]+?)\.rb$/.match(f)[1].capitalize.to_sym
  autoload(module_name, f)
end

#=> autoload :Engineer, 'engineer'
#=> autoload :Human, 'human'

puts Engineer.new #=> #<Engineer:0x007f91728847e8>