2010-04-23 14 views
15

El archivo contiene welcome.rb:¿Cómo puedo acceder a una variable definida en un archivo Ruby que necesitaba en IRB?

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 traer en variables predefinidas y tienen trabajo de inicialización hecho cuando require algo en su sesión IRB? Las variables globales no parecen ser el camino correcto.

Respuesta

14

Si bien es cierto que no se puede acceder a las variables locales definidas en los archivos necesarios, puede acceder a las constantes, y se puede acceder a cualquier cosa almacenada en un objeto que se tiene acceso en ambos contextos. Entonces, hay algunas maneras de compartir información, dependiendo de sus objetivos.

La solución más común es probablemente definir un módulo y poner allí su valor compartido. 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 
+2

Agradable, como comentario: Se puede tener acceso al 'WELCOME' en el código de John Hyland porque comenzó por * letra * upcase, esto hace que sea una constante. Ruby es interesante. –

2

creo que la mejor manera es definir una clase como esta

class Welcome 
    MESSAGE = "hi there" 
end 

continuación, en el IRB puede llamar a su código como este:

puts Welcome::MESSAGE 
2

Eso, al menos, debería permitir a la experiencia del IRB :

def welcome_message; "hi there" end 
3

No puede acceder a las variables locales definidas en el archivo incluido. Puede utilizar Ivars:

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

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