18

该文件welcome.rb包含:

welcome_message = "hi there"

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

require './welcome.rb'

puts welcome_message 

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

require当您进入 IRB 会话时,引入预定义变量并完成初始化工作的最佳方法是什么?全局变量似乎不是正确的路径。

4

4 回答 4

17

虽然您确实无法访问在所需文件中定义的局部变量,但您可以访问常量,并且您可以访问存储在对象中的任何内容,您在这两种上下文中都可以访问。因此,有几种方法可以共享信息,具体取决于您的目标。

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

# 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
于 2010-04-23T15:54:12.503 回答
4

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

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

# and then, in irb:
require 'welcome'
puts @welcome_message
#=>hi there!
于 2010-04-23T15:17:40.980 回答
3

这至少应该能够实现 irb 的体验:

def welcome_message; "hi there" end
于 2010-04-23T15:15:33.700 回答
2

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

class Welcome
  MESSAGE = "hi there"
end

然后在 irb 你可以这样调用你的代码:

puts Welcome::MESSAGE
于 2010-04-23T15:12:14.063 回答