Come posso accedere a una variabile definita in un file Ruby che ho richiesto in IRB?

Il file welcome.rb contiene:

 welcome_message = "hi there" 

Ma in IRB, non riesco ad accedere alla variabile che ho appena creato:

 require './welcome.rb' puts welcome_message # => undefined local variable or method `welcome_message' for main:Object 

Qual è il modo migliore per introdurre variabili predefinite e far eseguire il lavoro di inizializzazione quando si require qualcosa nella sessione IRB? Le variabili globali non sembrano la strada giusta.

Anche se è vero che non è ansible accedere alle variabili locali definite nei file richiesti, è ansible accedere alle costanti ed è ansible accedere a qualsiasi cosa memorizzata in un object a cui si ha accesso in entrambi i contesti. Quindi, ci sono alcuni modi per condividere le informazioni, a seconda dei tuoi obiettivi.

La soluzione più comune è probabilmente quella di definire un modulo e inserire il valore condiviso lì. Poiché i moduli sono costanti, sarai in grado di accedervi nel contesto richiesto.

 # in welcome.rb module Messages WELCOME = "hi there" end # in irb puts Messages::WELCOME # prints out "hi there" 

Puoi anche inserire il valore all’interno di una class, con lo stesso effetto. In alternativa, è ansible definirlo come costante nel file. Poiché il contesto predefinito è un object di class Object, denominato main, è ansible anche definire un metodo, una variabile di istanza o una variabile di class su main. Tutti questi approcci finiscono per essere essenzialmente diversi modi di rendere “variabili globali”, più o meno, e potrebbero non essere ottimali per la maggior parte degli scopi. D’altra parte, per i piccoli progetti con scopi ben definiti, potrebbero andare bene.

 # 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 

Non è ansible accedere alle variabili locali definite nel file incluso. Puoi usare ivars:

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

Penso che il modo migliore sia definire una class come questa

 class Welcome MESSAGE = "hi there" end 

quindi in irb puoi chiamare il tuo codice in questo modo:

 puts Welcome::MESSAGE 

Questo dovrebbe almeno abilitare l’esperienza di irb:

 def welcome_message; "hi there" end