有沒有辦法從fileevent處理程序處理非全局變量?考慮以下最低服務器:從fileevent處理程序處理非全局變量
proc initState {stateName} {
upvar $stateName state
set state(foo) bar
set state(baz) bla
# ...
return
}
proc handleConnection {stateName newsock clientAddress clientPort} {
upvar $stateName state
fconfigure $newsock -blocking 0
fconfigure $newsock -buffering line
fileevent $newsock readable [list handleData $newsock]
return
}
proc handleData {f} {
if {[eof $f]} {
fileevent $f readable {}
close $f
return
}
gets $f line
puts $f ok
# need to modify state here...
return
}
proc runServer {port} {
array set state {}
initState state
socket -server {handleConnection state} $port
vwait forever
}
runServer 1234
是否有可能操縱在runServer
範圍內創建的state
陣列或者是做這做state
一個全局變量的唯一途徑?
我很新的Tcl,如果我使用C我只是將一個指針state
傳遞到事件處理程序,但不幸的是,Tcl不允許這樣做。我在這裏做了什麼奇怪的事情,還有更多的Tcl-ish方式嗎?
感謝您的全面解釋,爲此使用命名空間是一個有趣的可能性。 – user1226159 2012-02-22 17:48:05
@user另一種可能性是爲每個連接生成一個唯一的標記名稱,並調用全局數組,使用'upvar#0 $ token ary;用$ ary(this)和$ ary(that)'做些什麼。這就是Tcl的'http'包的工作原理。 – 2012-02-22 20:12:32