在Ruby
中我可以同时要求目录中的所有类文件:
Dir["/path/to/directory/*.rb"].each {|file| require file }
但是如果类有继承关系怎么办?如何避免在超类之前需要子类? (或者这是不可能的?)
答案 0 :(得分:1)
实际上有一个肮脏的黑客,假设你已经命名所有文件对应于类名。但是,只有在不同类之间只有继承关系时,此方法才有效。 多次覆盖的方法不予考虑。
假设您在必填目录中有两个rb文件: engineer.rb 和 human.rb 。
- engineer.rb
class Engineer < Human
end
- human.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
但请注意,autoload很快就会死亡(因为它不是线程安全的),请参考这里(由Matz): http://www.ruby-forum.com/topic/3036681