rubyにはファイル全体をロードするか、何もロードしないバージョンrequire
がありますか?Rubyに全部または何も必要ありませんか?
問題がトップからロードを開始し、それはあなたが未完了の定義で終わる問題に直面している場合、例えば、以下はまだmodule C
が定義されていない場合でも、class A
をロードする必要とすることである。
class B
include C
end
私の特別なケースでは、相互依存ファイルの大きなセットと、それらのファイルをロードするローダーがあります。例として、ファイルの集合を4つのファイル(a.rb、b.rb、c.rb、w.rb)に単純にします。以下はそれらのファイルのリストです:
ローダは、現在のファイルのリストを取得し、1つずつ要求して動作します。いずれかのファイルに障害が発生すると、そのファイルはリストに残り、後で再試行されます。コードは次のようなものです:私は最終的にそれがAをロードしたいと思う(簡略化のため詳細の多くを削除)
# In file loader.rb
files = Dir["*.rb"].reject { |f| f =~ /loader/ }
files.sort! # just for the purpose of the example, to make them load in an order that causes the problem
files.reject! { |f| require(f) rescue nil } while files.size > 0
、そのBがCをロードし、その後、(それをスキップ)のみをロードすることはできません見つけますWがまだ読み込まれていない(スキップしている)のを見つけたら、BとWに戻ります。
この場合、p W.get_foo
の出力は、私が欲しいものです["in A", "in B", "in W"]
です。
実際には、AをロードしてからBを部分的にロードし、次にCをロードすると、WになるとBがすでに定義されているためロードできます。これにより、不適切な時刻にself.inherited
コードがトリガされ、の出力が["in A", "in W"]
に間違って表示され、@foo
の未準備値がコピーされます。
オール・オア・ナッシングなので、require
が解決されます。
アイデア?
ありがとう、私は各ファイルで 'require'を使うことができることを知っていましたが、私はそれが_automatic_であることを望んでいました。私は複雑なソリューション(テストするサンドボックスとして2番目のルビーインスタンスを実行しています)を考え出しましたが、これはベストプラクティスであると思われるので、私はそれを実行します:) –