所以,我测试出头了,并有一个“测试”过程就像这样:我可以使用uplevel/upvar而不必使用全局吗?
proc test {arg} {
global state
puts "Your arg is: $arg"
set state 1
}
test somearg
vwait state
从阅读uplevel和upvar,是有办法,我可以不必使用全球脱身,并使用其中一个选项将状态设置为“1”,然后退出该程序?
所以,我测试出头了,并有一个“测试”过程就像这样:我可以使用uplevel/upvar而不必使用全局吗?
proc test {arg} {
global state
puts "Your arg is: $arg"
set state 1
}
test somearg
vwait state
从阅读uplevel和upvar,是有办法,我可以不必使用全球脱身,并使用其中一个选项将状态设置为“1”,然后退出该程序?
是,除了vwait
总是使用全局变量的等待(严格地说,它解决了在全球范围内变量名;你可以使用其它名称空间,如果你提供合格的名称)。你不能做的就是等待一个局部变量(因为事件不能在自己的调用栈之外看到局部变量)。也许这将在未来发生变化,但当然不是现在。
关于这个问题有关global
,这些声明的效果都是一样的程序里面:
global foo
variable ::foo
upvar #0 foo foo
upvar ::foo foo
namespace upvar :: foo foo
您也有一个错误在你的代码:你等着它改变之前设定的状态。无论如何,这是行不通的,因为你必须先等待,并在某种事件中设置状态。
你在问两个不同的东西。首先,关于变量。您可以使用upvar
像这样:
proc test {arg} {
upvar #0 state state
puts "Your arg is: $arg"
set state 1
}
,或者更容易,你可以使用命名空间限定名称:
proc test {arg} {
puts "Your arg is: $arg"
set ::state 1
}
你问题的第二个“半”是vwait
一些奇怪的用法。我只想指出,你的代码片段不会完成,因为你正在等待变量'状态'改变,但没有事件会改变状态。当您拨打test
时,您已经更改了它。所以,除非你设置了一个窗口/按钮或者可能导致state
状态改变的东西,否则你的脚本将会挂起。
我有另一个proc,我用来配置网络设备后,我打开一个SSH会话。我有一个类似于上面发布的“vwait状态”声明。在proc中,一旦配置完成,我就会“设置状态1”。这工作没有问题。我只是好奇,看看为什么我的上面的例子不起作用......但我将不得不继续挖掘。 – Scott 2011-04-22 19:40:37
好的,这是有道理的。谢谢!这个“bug”是我的一个错字。我不是故意将它粘贴在那里。非常感谢! – Scott 2011-04-22 19:44:40