Was ist der Unterschied zwischen require_relative und erfordern in Ruby?
Was ist der Unterschied zwischen require_relative
und require
in Ruby?
Bevor 1.9.2 gab es keine Notwendigkeit für require_relative, denn die aktuellen Verzeichnis-script wurde in
require_relative benötigt eine Datei, die speziell darauf hingewiesen, relativ zu der Datei, nennt Sie. erfordern benötigt eine Datei im $LOAD_PATH.
$:
. Siehe stackoverflow.com/questions/2900370require_relative benötigt eine Datei, die speziell darauf hingewiesen, relativ zu der Datei, nennt Sie. erfordern benötigt eine Datei im $LOAD_PATH.
InformationsquelleAutor agentbanks217 | 2010-09-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schauen Sie sich nur die docs:
require './file.rb'
undrequire_relative 'file.rb'
?Ja.
require_relative
können Sie "laden Sie eine Datei " relativ zu der Datei mit denrequire_relative
- Anweisung". Mitrequire
,./
gibt einen Pfad relativ zum aktuellen Arbeitsverzeichnis.Ich denke, es ist mehr wichtig zu beachten, dass
require str
wird immer zu suchen, durch Verzeichnisse im $LOAD_PATH. Sollten Sie verwendenrequire_relative
wenn die Datei, die Sie brauchen, um zu laden existiert irgendwo relativ zu der Datei, die Anrufe für die Beladung. Reserverequire
für "externe" Abhängigkeiten.InformationsquelleAutor miku
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 Ciro Santilli 新疆改造中心996ICU六四事件
Von Ruby-API:
Finden Sie in der Dokumentation unter http://extensions.rubyforge.org/rdoc/classes/Kernel.html
InformationsquelleAutor svilenv
Zusammenfassung
Verwenden
require
für die installierten gemsVerwenden
require_relative
für lokale Dateienrequire
verwendet Ihre$LOAD_PATH
um die Dateien zu finden.require_relative
verwendet die aktuelle Position der Datei mit der Anweisungerfordern
Erfordern, stützt sich auf Sie mit installiert (z.B.
gem install [package]
) ein Paket irgendwo auf Ihrem system für diese Funktionalität.Bei der Verwendung
require
Sie kann Verwendung der "./
" - format für eine Datei in das aktuelle Verzeichnis, z.B.require "./my_file"
aber das ist nicht eine gemeinsame oder empfohlen, und Sie solltenrequire_relative
statt.require_relative
Bedeutet dies einfach die Datei 'relativ zum Speicherort der Datei mit der require_relative statement". Ich in der Regel empfehlen, die Dateien sollten sich "innerhalb" der aktuellen directory-Baum als Gegensatz zu "oben", z.B. nicht verwenden
(bis 3 Verzeichnisebenen) in der Datei-system, weil, die neigt zu unnötigen und spröde Abhängigkeiten. Jedoch in einigen Fällen, wenn Sie bereits 'Tiefe' in einem Verzeichnis-Baum dann "oben und unten" ein anderes Verzeichnis ast notwendig sein können. Einfacher vielleicht, nicht verwenden require_relative für Dateien, die außerhalb dieses repository (vorausgesetzt, Sie verwenden git, die weitgehend eine de-facto-standard in diesem Punkt, Ende 2018).
Beachten Sie, dass
require_relative
verwendet das aktuelle Verzeichnis der Datei mit dem require_relative - Anweisung (also nicht unbedingt Ihre aktuellen Verzeichnis, die Sie verwenden den Befehl aus). Dies hält dierequire_relative
Pfad "stabil", wie es immer relativ zu der Datei, die es erfordert, in der gleichen Weise.Okt 2018 - weitere tweak für immer mehr Klarheit
InformationsquelleAutor 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.stackoverflow.com/questions/837123/...
InformationsquelleAutor 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
.require_relative
war schneller, weil der Lader nicht zu durchqueren ist die Last Weg auf der Suche nach der Datei. Im wesentlichenrequire_relative
bietet einen direkten link.Frühe Beratung stellte über require_relative speed und die RSpec - changelog.
InformationsquelleAutor 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.
require_relative
Datei Könntest du bitte werfen Sie eine Idee zu diesem stackoverflow.com/questions/43487784/...InformationsquelleAutor peter