2011-04-22 85 views
2

所以,我测试出头了,并有一个“测试”过程就像这样:我可以使用uplevel/upvar而不必使用全局吗?

proc test {arg} { 
    global state 
    puts "Your arg is: $arg" 
    set state 1 
} 
test somearg 
vwait state 

从阅读uplevel和upvar,是有办法,我可以不必使用全球脱身,并使用其中一个选项将状态设置为“1”,然后退出该程序?

回答

3

是,除了vwait总是使用全局变量的等待(严格地说,它解决了在全球范围内变量名;你可以使用其它名称空间,如果你提供合格的名称)。你不能做的就是等待一个局部变量(因为事件不能在自己的调用栈之外看到局部变量)。也许这将在未来发生变化,但当然不是现在。

关于这个问题有关global,这些声明的效果都是一样的程序里面:

global foo 
variable ::foo 
upvar #0 foo foo 
upvar ::foo foo 
namespace upvar :: foo foo 

您也有一个错误在你的代码:你等着它改变之前设定的状态。无论如何,这是行不通的,因为你必须先等待,并在某种事件中设置状态。

+0

好的,这是有道理的。谢谢!这个“bug”是我的一个错字。我不是故意将它粘贴在那里。非常感谢! – Scott 2011-04-22 19:44:40

1

你在问两个不同的东西。首先,关于变量。您可以使用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状态改变的东西,否则你的脚本将会挂起。

值得一读wikiman pagevwait

+0

我有另一个proc,我用来配置网络设备后,我打开一个SSH会话。我有一个类似于上面发布的“vwait状态”声明。在proc中,一旦配置完成,我就会“设置状态1”。这工作没有问题。我只是好奇,看看为什么我的上面的例子不起作用......但我将不得不继续挖掘。 – Scott 2011-04-22 19:40:37

相关问题