Was ist der beste Weg, um alle Dateien aus einem Verzeichnis in Ruby erfordern?
Antworten
Zu viele Anzeigen?Am besten ist es, das Verzeichnis zum Ladepfad hinzuzufügen und dann require
den Basisnamen der einzelnen Dateien. Damit soll vermieden werden, dass dieselbe Datei versehentlich zweimal benötigt wird - was oft nicht beabsichtigt ist. Ob eine Datei geladen wird oder nicht, hängt davon ab, ob require
hat den Pfad schon einmal gesehen, der ihm zugewiesen wurde. Diese einfache irb-Sitzung zeigt zum Beispiel, dass man fälschlicherweise dieselbe Datei zweimal anfordern und laden kann.
$ irb
irb(main):001:0> require 'test'
=> true
irb(main):002:0> require './test'
=> true
irb(main):003:0> require './test.rb'
=> false
irb(main):004:0> require 'test'
=> false
Beachten Sie, dass die ersten beiden Zeilen true
was bedeutet, dass beide Male die gleiche Datei geladen wurde. Wenn Pfade verwendet werden, selbst wenn die Pfade auf denselben Ort zeigen, require
weiß nicht, dass die Datei bereits benötigt wurde.
Hier fügen wir stattdessen ein Verzeichnis zum Ladepfad hinzu und verlangen dann den Basisnamen jeder *.rb-Datei darin.
dir = "/path/to/directory"
$LOAD_PATH.unshift(dir)
Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }
Wenn es Ihnen egal ist, dass die Datei mehr als einmal benötigt wird, oder wenn Sie nur den Inhalt der Datei laden wollen, können Sie load
sollte stattdessen verwendet werden require
. Verwenden Sie in diesem Fall load, weil es besser ausdrückt, was Sie zu erreichen versuchen. Zum Beispiel:
Dir["/path/to/directory/*.rb"].each {|file| load file }
Anstelle der Verkettung von Pfaden, wie in einigen Antworten, verwende ich File.expand_path
:
Dir[File.expand_path('importers/*.rb', File.dirname(__FILE__))].each do |file|
require file
end
Aktualisierung:
Anstelle der Verwendung von File.dirname
könnten Sie Folgendes tun:
Dir[File.expand_path('../importers/*.rb', __FILE__)].each do |file|
require file
end
Wo ..
entfernt den Dateinamen von __FILE__
.