Ich habe eine Datei, main.rb mit folgendem Inhalt:
require "tokenizer.rb"
Die Datei tokenizer.rb befindet sich im selben Verzeichnis und hat folgenden Inhalt:
class Tokenizer
def self.tokenize(string)
return string.split(" ")
end
end
Wenn ich versuche, main.rb auszuführen, erhalte ich den folgenden Fehler:
C:\Documents and Settings\my\src\folder>ruby main.rb
C:/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- tokenizer.rb (LoadError)
from C:/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require '
from main.rb:1:in `<main>'
Mir ist gerade aufgefallen, dass wenn ich load
stattdessen require
alles benutze, alles gut funktioniert. Was kann das Problem hier sein?
.rb
Erweiterung hatAntworten:
Ich habe es gerade versucht und es funktioniert mit
require "./tokenizer"
. Hoffe das hilft.quelle
require_relative
wie ich es in meiner Antwort getan habe.Mach das einfach:
Wenn Sie dies in eine Ruby-Datei einfügen, die sich im selben Verzeichnis wie befindet
tokenizer.rb
, funktioniert es einwandfrei, unabhängig von Ihrem aktuellen Arbeitsverzeichnis (CWD).Erklärung, warum dies der beste Weg ist
Die anderen Antworten behaupten, Sie sollten sie verwenden
require './tokenizer'
, aber das ist die falsche Antwort, da sie nur funktioniert, wenn Sie Ihren Ruby-Prozess in demselben Verzeichnis ausführen, in dem sie sichtokenizer.rb
befinden. Der einzige Grundrequire
, eine solche Verwendung in Betracht zu ziehen , wäre, wenn Sie dies benötigen unterstützt Ruby 1.8, das nicht hatrequire_relative
.Die
require './tokenizer'
Antwort mag heute für Sie funktionieren, schränkt jedoch die Art und Weise, wie Sie Ihren Ruby-Code ausführen können, unnötig ein. Wenn Sie morgen Ihre Dateien in ein anderes Verzeichnis verschieben oder Ihren Ruby-Prozess nur aus einem anderen Verzeichnis starten möchten, müssen Sie alle dieserequire
Anweisungen überdenken .Die Verwendung
require
für den Zugriff auf Dateien, die sich auf dem Ladepfad befinden, ist eine gute Sache, und Ruby Gems tun dies ständig. Aber Sie sollten das Argument nichtrequire
mit einem beginnen, es.
sei denn, Sie tun etwas ganz Besonderes und wissen, was Sie tun.Wenn Sie Code schreiben, der Annahmen über seine Umgebung macht, sollten Sie sorgfältig überlegen, welche Annahmen zu treffen sind. In diesem Fall gibt es bis zu drei verschiedene Möglichkeiten, die
tokenizer
Datei anzufordern, und jede geht von einer anderen Annahme aus:require_relative 'path/to/tokenizer'
: Nimmt an, dass der relative Pfad zwischen den beiden Ruby-Quelldateien gleich bleibt.require 'path/to/tokenizer'
: Nimmt an, dasspath/to/tokenizer
sich das in einem der Verzeichnisse im Ladepfad befindet ($LOAD_PATH
). Dies erfordert im Allgemeinen eine zusätzliche Einrichtung, da Sie dem Ladepfad etwas hinzufügen müssen.require './path/to/tokenizer'
: Nimmt an, dass der relative Pfad vom aktuellen Arbeitsverzeichnis des Ruby-Prozessestokenizer.rb
zum gleich bleibt.Ich denke, dass für die meisten Menschen und die meisten Situationen die in den Optionen 1 und 2 getroffenen Annahmen im Laufe der Zeit eher zutreffen.
quelle
Ruby 1.9 hat das aktuelle Verzeichnis aus dem Ladepfad entfernt. Daher müssen Sie für diese Datei eine relative Anforderung erfüllen, wie David Grayson sagt:
Es ist nicht nötig, es mit einem Suffix zu versehen
.rb
, da Ruby klug genug ist, um zu wissen, dass Sie das sowieso meinen.quelle
Ruby 1.9 has removed the current directory from the load path
? Was ist das aktuelle Verzeichnis und Ladepfad? Vielen Dank.require_relative
. Morgen könnte er tippencd ..
und dannruby folder/main.rb
und sei traurig, dass deine Lösung nicht mehr funktioniert. Ich denke nicht, dass die Verwendungrequire
hier einen Nutzen hat.require_relative
(was zum Zeitpunkt der Veröffentlichung nicht existierte oder ich wusste es nicht)require
lädt eine Datei aus dem$LOAD_PATH
. Wenn Sie eine Datei relativ zur aktuell ausgeführten Datei anstelle der Datei benötigen$LOAD_PATH
, verwenden Sierequire_relative
.quelle
Ich würde empfehlen,
Vorausgesetzt, Sie wissen, dass sich die Datei im selben Arbeitsverzeichnis befindet.
Wenn Sie versuchen, es relativ zur Datei zu benötigen, können Sie es verwenden
Ich hoffe das hilft.
quelle
Eine andere nette kleine Methode ist, das aktuelle Verzeichnis in Ihren Ladepfad mit aufzunehmen
Sie können es in das Array $: ($ LOAD_PATH) verschieben, aber durch Verschieben wird es gezwungen, Ihr aktuelles Arbeitsverzeichnis vor dem Rest des Ladepfads zu laden.
Sobald Sie Ihr aktuelles Verzeichnis zu Ihrem Ladepfad hinzugefügt haben, müssen Sie keine weiteren Angaben machen
und kann einfach wieder verwenden
quelle
Dies funktioniert gut, wenn es sich in einem gem lib-Verzeichnis befindet und dies die tokenizer.rb ist
quelle
Ich habe jruby-1.7.4 verwendet, um meinen Ruby-Code zu kompilieren.
ist der Code, der den folgenden Fehler ausgelöst hat.
Ich entfernte rb von require und gab
Es hat gut funktioniert.
quelle
Für diejenigen, die absolut sicher sind, dass ihr relativer Pfad korrekt ist, war mein Problem, dass meine Dateien nicht die
.rb
Erweiterung hatten! (Obwohl ichRubyMine
die Dateien erstellt und ausgewählt habe, dass es sichRuby
bei der Erstellung um Dateien handelt.)Überprüfen Sie die Dateierweiterungen Ihrer Datei!
quelle
Wie wäre es, das aktuelle Verzeichnis in den Suchpfad aufzunehmen?
quelle
Das Problem ist, dass
require
nicht aus dem aktuellen Verzeichnis geladen wird. Das habe ich auch gedacht, aber dann habe ich diesen Thread gefunden . Zum Beispiel habe ich den folgenden Code ausprobiert:Wie zu sehen ist, hat es die Datei ok gelesen, aber ich konnte es nicht benötigen (der Pfad wurde nicht erkannt). und hier geht Code, der funktioniert:
Wie Sie sehen können, wird die Datei korrekt geladen, wenn Sie den vollständigen Pfad angeben.
quelle
Zuerst :
Und Sie sollten Ihr Passwort eingeben
Dann :
Erscheinen Aktualisieren rubygems-update FEHLER: Während der Ausführung von gem ... (OpenSSL :: SSL :: SSLError) stimmt der Hostname "gems.ruby-china.org" nicht mit dem Serverzertifikat überein
Dann:
Letzte Welche Sprache möchten Sie verwenden? [Swift / ObjC]
Möchten Sie Ihrer Bibliothek eine Demo-Anwendung hinzufügen? [ Ja Nein ]
Welche Test-Frameworks werden Sie verwenden? [Specta / Kiwi / Keine]
Möchten Sie viewbasierte Tests durchführen? [ Ja Nein ]
Was ist Ihr Klassenpräfix?
Ausführen der Pod-Installation in Ihrer neuen Bibliothek.
quelle
Sie müssen den Weg geben. Zumindest sollten Sie den Pfad aus dem aktuellen Verzeichnis angeben. Es wird sicher funktionieren. ./Dateiname
quelle