所以,我測試出頭了,並有一個「測試」過程就像這樣:我可以使用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