在Ruby
我可以一次要求一个目录中的所有类文件:
Dir["/path/to/directory/*.rb"].each {|file| require file }
但是如果类有继承关系呢?如何避免在超类之前要求子类?(或者这是不可能的?)
实际上有一个肮脏的技巧,假设您已将所有文件命名为对应于类名。但是这种方法只有在不同类之间 只有继承关系时才有效。不考虑多次覆盖方法。
假设您在需要的目录中有两个 rb 文件:engineer.rb和human.rb。
--工程师.rb
class Engineer < Human
end
--人类.rb
class Human
end
在另一个需要它们的文件中,如果你先指定工程师,你会得到一个错误:
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>
基本上自动加载会按需加载文件,因此请求的顺序不再是问题。
如果您想了解更多关于自动加载的信息,请查看这里: http ://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-autoload http://www.rubyinside.com/ ruby-techniques-revealed-autoload-1652.html
但请注意,自动加载很快就会失效(因为它不是线程安全的),请参阅此处(由 Matz 提供): http ://www.ruby-forum.com/topic/3036681