2010-04-23 8 views
15

Plik welcome.rb zawiera:Jak uzyskać dostęp do zmiennej zdefiniowanej w pliku Ruby wymaganym w IRB?

welcome_message = "hi there" 

Ale w IRB, nie może uzyskać dostępu do zmiennej Właśnie Utworzono:

require './welcome.rb' 

puts welcome_message 

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

Jaki jest najlepszy sposób, aby doprowadzić w predefiniowanych zmiennych i mieć pracę inicjalizacji zrobione, gdy masz coś do swojej sesji IRB? Zmienne globalne nie wydają się właściwą ścieżką.

Odpowiedz

14

Chociaż prawdą jest, że nie można uzyskać dostęp do zmiennych lokalnych zdefiniowanych w wymaganych plików, można uzyskać dostęp do stałych, można uzyskać dostęp do niczego przechowywane w obiekcie, że masz dostęp do obu kontekstach. Istnieje kilka sposobów udostępniania informacji w zależności od celów.

Najpopularniejszym rozwiązaniem jest prawdopodobnie zdefiniowanie modułu i umieszczenie w nim wartości wspólnej. Ponieważ moduły są stałe, będziesz mieć do nich dostęp w wymagającym kontekście.

# in welcome.rb 
module Messages 
    WELCOME = "hi there" 
end 

# in irb 
puts Messages::WELCOME # prints out "hi there" 

Można również umieścić wartość wewnątrz klasy, aby osiągnąć ten sam efekt. Alternatywnie możesz po prostu zdefiniować go jako stałą w pliku. Ponieważ kontekst domyślny jest obiektem klasy Object, nazywanym głównym, można również zdefiniować metodę, zmienną instancji lub zmienną klasy na głównej. Wszystkie te podejścia są zasadniczo różnymi sposobami tworzenia "zmiennych globalnych" mniej więcej i mogą nie być optymalne dla większości celów. Z drugiej strony, w przypadku małych projektów z bardzo dobrze zdefiniowanymi zakresami mogą one być w porządku.

# in welcome.rb 
WELCOME = "hi constant" 
@welcome = "hi instance var" 
@@welcome = "hi class var" 
def welcome 
    "hi method" 
end 


# in irb 
# These all print out what you would expect. 
puts WELCOME 
puts @welcome 
puts @@welcome 
puts welcome 
+2

Miło, jako komentarz: "WELCOME" w kodzie Johna Hylanda można uzyskać, ponieważ zaczyna się od * upcase * letter, co czyni go stałą. Ruby to zainteresowanie. –

2

Myślę, że najlepszym sposobem jest zdefiniowanie klasy jak ten

class Welcome 
    MESSAGE = "hi there" 
end 

następnie w IRB można nazwać swój kod tak:

puts Welcome::MESSAGE 
2

To powinno przynajmniej umożliwić doświadczenie z IRB :

def welcome_message; "hi there" end 
3

Nie można uzyskać dostępu do zmiennych lokalnych zdefiniowanych w dołączonym pliku. Można użyć Ivars:

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

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