Ruby:如何安全地一次性要求目录中的所有类?

时间:2012-08-22 09:32:08

标签: ruby require

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

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

但是如果类有继承关系怎么办?如何避免在超类之前需要子类? (或者这是不可能的?)

1 个答案:

答案 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