Was ist der Unterschied zwischen require_relative und require in Ruby?
Was ist der Unterschied zwischen require_relative
und require
in Ruby?
InformationsquelleAutor der Frage agentbanks217 | 2010-09-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schauen Sie sich nur die docs:
InformationsquelleAutor der Antwort miku
Von Ruby-API:
Finden Sie in der Dokumentation unter http://extensions.rubyforge.org/rdoc/classes/Kernel.html
InformationsquelleAutor der Antwort svilenv
require_relative
ist ein bequemer Teilmenge vonrequire
entspricht:
wenn
__FILE__
definiert ist, oder es wirftLoadError
sonst.Dies impliziert, dass:
require_relative 'a'
undrequire_relative './a'
erfordern relativ zu der aktuelle Datei (__FILE__
).Dies ist, was Sie verwenden möchten, wenn Sie erfordern innerhalb Ihrer Bibliothek, da Sie nicht wollen, das Ergebnis hängt vom aktuellen Verzeichnis des Aufrufers.
eval('require_relative("a.rb")')
wirftLoadError
weil__FILE__
ist nicht definiert im innereneval
.Dies ist der Grund, warum Sie nicht verwenden können
require_relative
im RSpec tests, dieeval
ed.Die folgenden Operationen sind nur möglich mit
require
:require './a.rb'
erfordert relativ zum aktuellen Verzeichnisrequire 'a.rb'
verwendet den Suchpfad ($LOAD_PATH
) zu verlangen. Es nicht finden, Dateien relativ zum aktuellen Verzeichnis oder Pfad.Dies ist nicht möglich, mit
require_relative
weil die docs sagen, dass Pfad-Suche nur passiert, wenn "das mit dem Namen nicht auflösen, um einen absoluten Pfad" (d.h. Sie beginnt mit/
oder./
oder../
), das ist immer der Fall fürFile.expand_path
.Folgende Bedienung ist möglich mit beiden, aber Sie verwenden möchten
require
wie es ist kürzer und effizienter:require '/a.rb'
undrequire_relative '/a.rb'
beide benötigen den absoluten Pfad.Lesen der Quelle
Wenn die docs nicht klar sind, empfehle ich, dass Sie werfen Sie einen Blick auf die Quellen Umschalten Quelle in der Dokumentation). In einigen Fällen hilft es, zu verstehen, was Los ist.
erfordern:
require_relative:
Dies lässt den Schluss zu, dass
ist das gleiche wie:
weil:
InformationsquelleAutor der Antwort Ciro Santilli 新疆改造中心 六四事件 法轮功
require
verwendet die aktuellen Verzeichnisdass Sie das Programm ausführen ausrequire_relative
verwendet das Verzeichnis, wo das Programm sich befindetZum Beispiel, wenn ein Programm in
~/code
und heißt1.rb
und du hast getan, eine cd in das Verzeichnisist und Sie versuchen, und führen Sie das ruby-Programm mit
dann innerhalb
1.rb
beide funktionieren.
Jedoch wenn Sie in einem anderen Verzeichnis, sagen
ist und Sie versuchen, und führen Sie das Programm mit
dannerhalten Sie eine Fehlermeldung wie
wenn man versucht,
in der Erwägung, dass mit
funktioniert immer noch ok _because die Referenz (
3.rb
) ist relative an, in welchem Verzeichnis das Programm (1.rb
) befindet.InformationsquelleAutor der Antwort Michael Durrant
Die top-Antworten sind korrekt, aber tief technische. Für diejenigen, die neuere für die Ruby -
require_relative
wird höchstwahrscheinlich verwendet werden, um im code aus einer anderen Datei, die Sie schrieb.was zum Beispiel, wenn Sie Daten in
~/my-project/data.rb
ist, und man möchte, dass in~/my-project/solution.rb
? insolution.rb
möchten, fügen Sierequire_relative 'data'
.es ist wichtig zu beachten, dass diese Dateien müssen nicht im gleichen Verzeichnis.
require_relative '../../folder1/folder2/data'
ist auch gültig.require
wird höchstwahrscheinlich verwendet werden, um im code aus einer Bibliothek, die jemand anderes geschrieben hat.was zum Beispiel, wenn Sie möchten, verwenden Sie eine der Hilfsfunktionen in den
active_support
Bibliothek? Sie müssen installieren Sie das Schmuckstück mitgem install activesupport
und dann in der Dateirequire 'active_support'
.Anders gesagt--
require_relative
benötigt eine Datei, die speziell darauf hingewiesen, relativ zu der Datei, nennt Sie.require
erfordert eine Datei im $LOAD_PATH.InformationsquelleAutor der Antwort common-nighthawk
Ich sah nur die RSpec-code hat einige Kommentar auf
require_relative
als O(1) konstant undrequire
wird O(N) linear. Also wahrscheinlich der Unterschied ist, dassrequire_relative
ist die bevorzugte man alsrequire
.InformationsquelleAutor der Antwort mech
Ich möchte hinzufügen, dass, wenn Sie windows verwenden, können Sie
require './1.rb'
wenn das Skript ausgeführt wird, lokalen oder einem zugeordneten Netzlaufwerk, aber wenn Sie von einem UNC \servername\Freigabename\Ordner-Pfad, den Sie verwenden müssenrequire_relative './1.rb'
Ich glaube nicht, mischen sich in der Diskussion, die Verwendung für andere Gründe.
InformationsquelleAutor der Antwort peter