有没有办法从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