从irb加载时,将脚本变量保留在范围内

时间:2013-03-27 17:34:49

标签: python ruby ipython irb

当我在IPython中执行脚本时,使用run myscript.py,脚本中的名称随后可以在交互式解释器中使用,以便我进一步试验。

irb中,当我使用load 'myscript.rb'运行脚本时似乎不会发生这种情况。

如何将变量保留在交互式ruby的范围内?

2 个答案:

答案 0 :(得分:2)

局部变量是它们定义的范围的局部变量。这就是它们被称为 local 变量的原因。如果您在脚本myscript.rb中定义局部变量,那么它将在该范围内定义,在其他地方。这是局部变量的重点。

如果您想要一个全局可用的变量,请使用全局变量。或者可能是顶级main对象的实例变量。

答案 1 :(得分:1)

我发现这个问题的答案是使用全局变量或类或函数。

例如,如果我使用watir并且我有一个我正在与之交互的浏览器对象,我可以使用以下内容从测试脚本中获取它:

全局变量

watir_test.rb

require "watir-webdriver"

browser = Watir::Browser.new :chrome
$b = browser

# all sorts of preliminary stuff I do on the browser object

# end of my test script

现在启动irb后,我加载了测试文件

irb(main):001:0> load './watir_test.rb'
irb(main):002:0> browser
NameError: undefined local variable or method `browser' for main:Object
    from (irb):2
    from C:/Ruby193/bin/irb:12:in `<main>'
irb(main):004:0> $b
=> #<Watir::Browser:0x..fd9200f9a url="http....">

返回的元素

test_code.rb

    def test_code
        a = 5    
        return a
    end

> load 'test_code.rb'
> a = test_code()

返回+ local_variables

这是一个很好的例子: https://stackoverflow.com/a/1961317/999943

Ruby local_variables returns :symbols?

def foo(((a, b, c, d), e, *f), g, *h)
  local_variables.sort.each do |lvar| puts "#{lvar} => #{eval(lvar).inspect}" end
end

foo([[1, 2, 3], 4, 5, 6], 7, 8, 9)
# a => 1
# b => 2
# c => 3
# d => nil
# e => 4
# f => [5, 6]
# g => 7
# h => [8, 9]