Tcl 从fileevent处理程序操纵非全局变量
有没有办法从fileevent处理程序操纵非全局变量?考虑下面的最小服务器:Tcl 从fileevent处理程序操纵非全局变量,tcl,Tcl,有没有办法从fileevent处理程序操纵非全局变量?考虑下面的最小服务器: proc initState {stateName} { upvar $stateName state set state(foo) bar set state(baz) bla # ... return } proc handleConnection {stateName newsock clientAddress clientPort} { upvar $state
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的方式吗?那根本不起作用。问题是Tcl的堆栈帧不能以您想要的方式持久化
解决此问题的标准选项包括:
sock42,hostname
”这样的复合键是相当合法的namespace-upvar
命令会使这变得更容易这根本行不通。问题是Tcl的堆栈帧不能以您想要的方式持久化 解决此问题的标准选项包括:
sock42,hostname
”这样的复合键是相当合法的namespace-upvar
命令会使这变得更容易感谢您的全面解释,为此使用名称空间是一种有趣的可能性。@用户另一种可能性是为每个连接生成一个唯一的令牌名称,并使用
upvar#0$token ary;使用$ary(这个)和$ary(那个)
。这就是Tcl的http
包的工作原理。感谢您的全面解释,为此使用名称空间是一种有趣的可能性。@用户另一种可能性是为每个连接生成一个唯一的令牌名称,并使用upvar\0$token ary调用全局数组;使用$ary(这个)和$ary(那个)
。这就是Tcl的http
包的工作原理。