0

ではRuby、ディレクトリ内のすべてのクラス ファイルを一度に要求できます。

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

しかし、クラスに継承関係がある場合はどうなるでしょうか。スーパークラスの前にサブクラスを要求しないようにするにはどうすればよいですか? (それとも無理?)

4

1 に答える 1

1

実際には、汚いハックがあります。すべてのファイルにクラス名に対応する名前を付けたとします。ただし、このアプローチは、異なるクラス間 に継承関係がある場合にのみ機能します。メソッドの複数回のオーバーライドは考慮されません。

必要なディレクトリに 2 つの rb ファイルがあるとします: engine.rbhuman.rbです。

--エンジニア.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>

基本的に、オートロードはオンデマンドでファイルを要求するため、要求のシーケンスはもはや問題ではありません。

autoload について詳しく知りたい場合は、こちらを確認してください: 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 は間もなく廃止されることに注意してください (スレッド セーフではないため)。こちら (by Matz) を参照してください: http://www.ruby-forum.com/topic/3036681

于 2012-08-22T14:27:22.300 に答える