2010-04-23 44 views
15

文件welcome.rb包含:如何访问我在IRB中需要的Ruby文件中定义的变量?

welcome_message = "hi there" 

但在IRB,我无法访问我刚创建的变量:

require './welcome.rb' 

puts welcome_message 

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

什么是预定义变量带来的最佳方式,并有初始化工作require什么时候进入IRB会话?全局变量似乎不是正确的路径。

回答

14

虽然这是事实,你不能访问所需的文件中定义的局部变量,你可以访问常量,您可以访问存储在你必须在两种情况下访问对象什么。因此,根据您的目标,有几种分享信息的方式。

最常见的解决方案可能是定义一个模块并将共享值放在那里。由于模块是常量,因此您可以在需要的上下文中访问它。

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

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

你也可以把这个值放到一个类里面,效果差不多。或者,您可以将其定义为文件中的常量。由于默认上下文是Object类的一个对象,称为main,您还可以在main上定义一个方法,实例变量或类变量。所有这些方法最终都会以不同的方式制造“全局变量”,或多或少,并且可能不适用于大多数目的。另一方面,对于具有非常明确的范围的小型项目,它们可能没有问题。

# 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

不错,作为一个评论:约翰海兰的代码中的'WELCOME'可以被访问,因为它由* upcase *字母开头,这使它成为一个常量。 Ruby是有趣的。 – 2012-10-20 17:38:21

2

我认为最好的方法是这样定义

class Welcome 
    MESSAGE = "hi there" 
end 

一类,那么在IRB你可以打电话给你这样的代码:

puts Welcome::MESSAGE 
2

这至少应该能够从IRB经验:

def welcome_message; "hi there" end 
3

您无法访问在包含文件中定义的局部变量。您可以使用高德:

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

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