2011-04-22 31 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

相關問題