2016-03-23 18 views
3

Ich versuche, eine Klasse aus einer anderen Datei zu verwenden.Wie verwenden Sie eine Klasse aus einer anderen Datei?

something.rb

class Something 
    def initialize 
    end 
    def getText 
    'Some example text' 
    end 
end 

another.rb

class Another 
end 

somethingVar = Something.new 
puts somethingVar.getText 

Das gibt mir den Fehler

/usr/bin/ruby -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) /home/chris/RubymineProjects/untitled1/another.rb 
/home/chris/RubymineProjects/untitled1/another.rb:4:in `<top (required)>': uninitialized constant Something (NameError) 
    from -e:1:in `load' 
    from -e:1:in `<main>' 

Was mache ich falsch?

+0

Ist es Projektschienen? Wenn nicht, müssen Sie die Datei mit der Definition anfordern, bevor Sie sie verwenden können. – BroiSatse

+0

@Chris, wenn Sie der Meinung sind, dass die Frage beantwortet wurde, ist es eine gute Idee, diese Antwort als akzeptiert zu markieren. –

Antwort

4

Die häufigste Art Code wie folgt zu verwenden ist über require:

require 'something.rb' 

..will die Verwendung von Klassen in dieser Datei definiert aktivieren, aber nur, wenn die Datei gefunden werden kann, entweder in der Ruby-Ladepfad oder mit einem installierten Juwel verknüpft.

Wenn Sie Ihre eigenen schreiben wollen, vor allem für die Prüfung oder kurzfristige Hacking, werden Sie wahrscheinlich wollen require_relative verwenden, die einen relativen Pfad zur Datei nimmt die Sie verwenden möchten:

require_relative './something.rb'` 

Das sollte funktionieren, wenn sich something.rb im selben Verzeichnis wie another befindet. Rb

Weitere Informationen über verschiedene Möglichkeiten, Code in Ruby wiederzuverwenden, finden Sie unter here.

+1

require_relative funktioniert! Danke –

+0

Um mich selbst zu nitpicken, 'require' funktioniert auch, wenn Sie einen absoluten Pfad vom Root des Dateisystems geben. Aber lies den letzten Link dort für ein wirklich vollständiges Verständnis. –

+2

Sie brauchen nicht (und es ist normal, dass Sie die Erweiterung weglassen) in Calls zu erfordern/require_relative –

5

Sie müssen die something.rb verlangen.

require 'something.rb' 
+0

Zunächst dachte ich, aber wenn ich das an der Spitze eines anderen rb.rb bekomme ich den folgenden Fehler: in 'require ': kann nicht solche Datei laden - etwas (LoadError) –

+0

Versuchen Sie' require'./Something'' . –

+0

Das wird nicht funktionieren, da '.' (das aktuelle Verzeichnis) nicht in' $ LOAD_PATH' steht. 'require_relative' ist der richtige Weg. – DMKE

0

HINWEIS: Es ist extrem üblich, den Dateinamen OHNE die Erweiterung .rb zu sehen, wie in den folgenden Beispielen gezeigt.

Wie von anderen angegeben, müssen Sie "etwas" anfordern, wenn Sie sich im selben Lastpfad befinden.

require 'something' 

oder require_relative './etwas', indem Sie den Pfad zur Datei angeben.

require_relative 'something' 

„Abgesehen von der Suche schöner, dieser Bareword Weg zur Erweiterung des Verweises ist notwendig, weil nicht alle Erweiterungen Dateien in .rb Endung verwenden. Insbesondere geschrieben Erweiterungen in C in Dateien gespeichert sind, mit .so enden oder. dll. Um den Prozess transparent zu halten - das heißt, damit Sie nicht wissen, ob die gewünschte Erweiterung eine .rb-Datei verwendet oder nicht - akzeptiert Ruby ein Bareword und führt dann eine automatische Dateisuche durch und versucht mögliche Dateinamen auszuprobieren Es findet die Datei, die der von Ihnen angeforderten Erweiterung entspricht. "

Für mehr Informationen - http://rubylearning.com/satishtalim/including_other_files_in_ruby.html

Verwandte Themen