¿Cómo puedo acceder a una variable definida en un archivo Ruby que necesitaba en IRB?

El archivo welcome.rb contiene:

 welcome_message = "hi there" 

Pero en IRB, no puedo acceder a la variable que acabo de crear:

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

¿Cuál es la mejor manera de introducir variables predefinidas y realizar trabajos de inicialización cuando require algo en su sesión IRB? Las variables globales no parecen ser el camino correcto.

Si bien es cierto que no puede acceder a las variables locales definidas en los archivos requeridos, puede acceder a las constantes, y puede acceder a cualquier elemento almacenado en un objeto al que tenga acceso en ambos contextos. Entonces, hay algunas maneras de compartir información, dependiendo de sus objectives.

La solución más común es, probablemente, definir un módulo y poner su valor compartido allí. Como los módulos son constantes, podrá acceder a él en el contexto requerido.

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

También podría poner el valor dentro de una clase, para casi el mismo efecto. Alternativamente, puede definirlo como una constante en el archivo. Como el contexto predeterminado es un objeto de clase Object, denominado main, también puede definir un método, variable de instancia o variable de clase en main. Todos estos enfoques terminan siendo formas esencialmente diferentes de hacer “variables globales”, más o menos, y pueden no ser óptimas para la mayoría de los propósitos. Por otro lado, para proyectos pequeños con ámbitos bien definidos, pueden estar bien.

 # 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 

No puede acceder a las variables locales definidas en el archivo incluido. Puedes usar ivars:

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

Creo que la mejor manera es definir una clase como esta

 class Welcome MESSAGE = "hi there" end 

luego en irb puedes llamar a tu código así:

 puts Welcome::MESSAGE 

Eso debería al menos habilitar la experiencia de irb:

 def welcome_message; "hi there" end