首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以使用uplevel/upvar而不是全局吗?

我可以使用uplevel/upvar而不是全局吗?
EN

Stack Overflow用户
提问于 2011-04-23 02:56:22
回答 2查看 760关注 0票数 2

所以,我正在测试一些东西,并有一个“测试”过程,如下所示:

代码语言:javascript
复制
proc test {arg} {
    global state
    puts "Your arg is: $arg"
    set state 1
}
test somearg
vwait state

通过阅读关于uplevel和upvar的文章,有没有一种方法可以让我不必使用global,并使用其中一个选项将状态设置为"1“,然后退出程序?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-23 03:31:30

可以,但vwait总是使用全局变量来等待(严格来说,它解析全局范围内的变量名称;如果提供限定名称,则可以使用其他名称空间)。您不能做的是等待局部变量(因为事件不能在它们自己的调用堆栈之外看到局部变量)。也许这在未来会改变,但现在肯定不会。

关于global的问题,这些语句在过程中的效果都是一样的:

代码语言:javascript
复制
global foo
variable ::foo
upvar #0 foo foo
upvar ::foo foo
namespace upvar :: foo foo

您的代码中也有一个bug :在等待状态更改之前设置状态。这无论如何都不会起作用,因为您必须先等待,然后从某种事件中设置状态。

票数 3
EN

Stack Overflow用户

发布于 2011-04-23 03:29:39

你要求的是两种不同的东西。首先,关于变量。您可以像这样使用upvar

代码语言:javascript
复制
proc test {arg} {
    upvar #0 state state
    puts "Your arg is: $arg"
    set state 1
}

或者,更简单的是,您可以只使用名称空间限定名:

代码语言:javascript
复制
proc test {arg} {
  puts "Your arg is: $arg"
  set ::state 1
}

你问题的第二个“一半”是vwait的一些奇怪的用法。我只想指出,您的代码片段不会完成,因为您正在等待变量' state‘更改,但没有任何事件会更改状态。在调用test时,您已经更改了它。所以,除非你设置了一个窗口/按钮或者其他可能导致state状态改变的东西,否则你的脚本将会挂起。

值得一读的是wikivwaitman page

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5758948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档