2010-04-23 10 views
15

Die Datei welcome.rb enthält:Wie kann ich auf eine Variable zugreifen, die in einer Ruby-Datei definiert ist, die ich in IRB benötigt habe?

welcome_message = "hi there" 

Aber in IRB, kann ich auf die Variable nicht ich gerade erstellt:

require './welcome.rb' 

puts welcome_message 

# => undefined local variable or method `welcome_message' for main:Object 

Was ist der beste Weg in vordefinierte Variablen zu bringen ist und Initialisierungsarbeit haben fertig, wenn Sie require etwas in Ihre IRB-Sitzung? Globale Variablen scheinen nicht der richtige Weg zu sein.

Antwort

14

Während es wahr ist, dass Sie nicht auf lokale Variablen in erforderlichen Dateien definiert zugreifen können, Sie Konstanten zugreifen können, und Sie können alles in einem Objekt gespeichert sind, zugreifen, die Sie Zugriff auf in beiden Kontexten haben. Es gibt also verschiedene Möglichkeiten, Informationen zu teilen, abhängig von Ihren Zielen.

Die häufigste Lösung ist wahrscheinlich ein Modul und setzen Sie Ihren gemeinsamen Wert dort zu definieren. Da Module Konstanten sind, können Sie im anfordernden Kontext darauf zugreifen.

Sie könnten den Wert auch in eine Klasse einfügen, um den gleichen Effekt zu erzielen. Alternativ könnten Sie es einfach als Konstante in der Datei definieren. Da der Standardkontext ein Objekt der Klasse Object ist, das als main bezeichnet wird, könnten Sie auch eine Methode, eine Instanzvariable oder eine Klassenvariable auf main definieren. Alle diese Ansätze sind im Wesentlichen unterschiedliche Wege, "globale Variablen" mehr oder weniger zu machen, und sind für die meisten Zwecke möglicherweise nicht optimal. Auf der anderen Seite, für kleine Projekte mit sehr gut definierten Bereichen, können sie in Ordnung sein.

+2

Schön, als ein Kommentar: Die 'WELCOME' in John Hylands Code kann zugegriffen werden, weil es durch * upcase * Brief begann, dies macht es zu einer Konstante. Rubin ist interessant. –

2

Ich denke, der beste Weg, um eine Klasse wie diese

class Welcome 
    MESSAGE = "hi there" 
end 

dann in irb zu definieren ist, dass Sie Ihren Code wie folgt anrufen:

puts Welcome::MESSAGE 
2

Das sollte zumindest die Erfahrung von irb ermöglichen :

def welcome_message; "hi there" end 
3

Sie können nicht auf lokale Variablen zugreifen, die in der enthaltenen Datei definiert sind. Sie können ivars verwenden:

# in welcome.rb 
@welcome_message = 'hi there!' 

# and then, in irb: 
require 'welcome' 
puts @welcome_message 
#=>hi there!