当我在IPython中执行脚本时,使用run myscript.py
,脚本中的名称随后可以在交互式解释器中使用,以便我进一步试验。
在irb
中,当我使用load 'myscript.rb'
运行脚本时似乎不会发生这种情况。
如何将变量保留在交互式ruby的范围内?
答案 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()
这是一个很好的例子: 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]