0

Ruby我可以一次要求一个目录中的所有类文件:

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

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

4

1 回答 1

1

实际上有一个肮脏的技巧,假设您已将所有文件命名为对应于类名。但是这种方法只有在不同类之间 只有继承关系时才有效。不考虑多次覆盖方法。

假设您在需要的目录中有两个 rb 文件:engineer.rbhuman.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

于 2012-08-22T14:27:22.300 回答