当我在 IPython 中执行脚本时,通过使用run myscript.py
,脚本中的名称将在交互式解释器中可用,供我进一步试验。
当irb
我使用运行脚本时,这似乎没有发生load 'myscript.rb'
。
如何将变量保持在交互式 ruby 的范围内?
局部变量在定义它们的范围内是局部的。这就是它们被称为局部变量的原因。如果您在脚本中定义了一个局部变量myscript.rb
,那么它将被定义在该范围内而不是其他任何地方。这就是局部变量的全部意义所在。
如果您想要一个全局可用的变量,请使用全局变量。或者可能是顶级main
对象的实例变量。
我在查看此问题时发现的答案是使用全局变量或类或函数。
因此,例如,如果我正在使用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
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]