2011-05-25 386 views
6

是否可以在Tcl中聲明一個靜態變量?
我使用某個函數來捕獲未知的命令錯誤,並且我希望它在未知命令的第一次出現時打印錯誤消息 - 所以我需要在proc內保留類似靜態列表的東西。那可能嗎?Tcl中的靜態變量

回答

4

或者你也可以只使用一個直全局變量:

set varList {} 

proc useCount {value} { 
    global varList ; 
    lappend varList $value 
} 

useCount One 
useCount Two 
puts $varList 
2

不可以,但你可以使用一個全球性的(通常命名空間)陣列由PROC名稱,例如索引:

namespace eval foo { 
    variable statics 
    array set statics {} 
} 
... 
proc ::foo::bar args { 
    variable statics 
    upvar 0 statics([lindex [info level 0] 0]) myvar 
    # use myvar 
} 
+0

更新:另請參閱http://wiki.tcl.tk/memoizing for a general idea – kostix 2011-05-25 12:10:40

2

Tcl的做不支持靜態變量。除了在名稱空間內使用全局變量或變量外,另一種選擇是將您的過程作爲類中的方法實現(請參見[incr tcl]或snit)。如果你必須實現靜態變量,Tcl的wiki有一個網頁,其中討論這個問題:http://wiki.tcl.tk/1532

0

因爲我不喜歡全局變量(除非你有一個小腳本),我從@kostix和@Jackson相結合的解決方案:

namespace eval foo { 
    variable varList {} 
} 
proc foo::useCount {value} { 
    variable varList 
    lappend varList $value 
} 

foo::useCount One 
foo::useCount Two 

puts $foo::varList