所以,我正在测试一些东西,并有一个“测试”过程,如下所示:
proc test {arg} {
global state
puts "Your arg is: $arg"
set state 1
}
test somearg
vwait state通过阅读关于uplevel和upvar的文章,有没有一种方法可以让我不必使用global,并使用其中一个选项将状态设置为"1“,然后退出程序?
发布于 2011-04-23 03:31:30
可以,但vwait总是使用全局变量来等待(严格来说,它解析全局范围内的变量名称;如果提供限定名称,则可以使用其他名称空间)。您不能做的是等待局部变量(因为事件不能在它们自己的调用堆栈之外看到局部变量)。也许这在未来会改变,但现在肯定不会。
关于global的问题,这些语句在过程中的效果都是一样的:
global foo
variable ::foo
upvar #0 foo foo
upvar ::foo foo
namespace upvar :: foo foo您的代码中也有一个bug :在等待状态更改之前设置状态。这无论如何都不会起作用,因为您必须先等待,然后从某种事件中设置状态。
发布于 2011-04-23 03:29:39
你要求的是两种不同的东西。首先,关于变量。您可以像这样使用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的一些奇怪的用法。我只想指出,您的代码片段不会完成,因为您正在等待变量' state‘更改,但没有任何事件会更改状态。在调用test时,您已经更改了它。所以,除非你设置了一个窗口/按钮或者其他可能导致state状态改变的东西,否则你的脚本将会挂起。
值得一读的是wiki和vwait的man page。
https://stackoverflow.com/questions/5758948
复制相似问题