2017-02-24 5 views
-1

ist:Sind diese 2 Anweisungen in Ruby gleich?

require './test_req.rb' 

gleiche mit diesem:

require './test_req' 

und diese

require_relative 'test_req.rb' 

in Ruby? Ich habe den Unterschied zwischen diesen 3 untersucht und finde keine Funktionalität.

+0

Ich sehe keinen Unterschied zwischen den ersten beiden Aussagen. Sie sehen gleich aus –

+0

@RichardHamilton Entschuldigung Ich entfernte die Erweiterung aus dem zweiten Beispiel, es war ein Tippfehler. – anemaria20

+4

Können Sie das nicht selbst mit ein paar einfachen Tests beantworten? –

Antwort

2

ist:

require './test_req.rb' 

gleiche mit diesem:

require './test_req' 

Nein, die erste für eine Datei test_req.rb im aktuellen Arbeitsverzeichnis genannt aussehen wird. Der zweite sucht nach einer implementierungsdefinierten Gruppe von Dateien im aktuellen Arbeitsverzeichnis. YARV sucht nach test_req.rb, test_req.rbw, test_req.so, test_req.dll und test_req.dylib. JRuby sucht nach test_req.rb, test_req.rbw, test_req.so, test_req.dll, test_req.dylib, test_req.class und test_req.jar. Rubinius sucht nach test_req.rb, test_req.rbw, test_req.so, test_req.dll, test_req.dylib und test_req.rba. (Hinweis: Diese Liste stammt aus dem Speicher. Ich habe sie nicht überprüft.)

Beachten Sie, dass beide nie verwendet werden sollten. Das aktuelle Arbeitsverzeichnis befindet sich außerhalb der Kontrolle des Skripts. Im besten Fall kann dies zu einem spröden Skript führen, das manchmal mit einem LoadError scheitern kann, abhängig davon, was das aktuelle Arbeitsverzeichnis gerade ist, wenn das Skript ausgeführt wird. Es ist sogar noch schlimmer: Das aktuelle Arbeitsverzeichnis befindet sich nicht nur außerhalb der Kontrolle des Skripts, es liegt unter der Kontrolle des Aufrufers. Dies bedeutet, dass der Aufrufer beliebigen Code in Ihr Skript einfügen kann, indem er in einem von ihm gesteuerten Verzeichnis seine eigene test_req.rb bereitstellt und dieses Verzeichnis vor dem Aufruf des Skripts als aktuelles Arbeitsverzeichnis einstellt.

Deshalb wurde . aus dem $LOAD_PATH in Ruby 1.9 entfernt, und deshalb sollten Sie es nie verwenden.

und dies

require_relative 'test_req.rb' 

Dies ist zu einem der anderen zwei nicht gleichwertig. Dies wird nach einer Datei mit dem Namen test_req.rb im selben Verzeichnis suchen, in dem sich die aktuell ausgeführte Datei befindet, anstatt im aktuellen Arbeitsverzeichnis.