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
グローバル変数を作り、これを行うための唯一の方法は次のとおりです。以下の最小限のサーバーを考えてみましょうか?
私はCを使用していたとしても、単にstate
へのポインタをイベントハンドラに渡しますが、残念ながらTclはそれを許可しません。私はここで変なことをしていますか?もっとTcl-ishの方法がありますか?
包括的な説明をいただきありがとうございます。名前空間を使用すると面白い可能性があります。 – user1226159
@user別の方法として、接続ごとに固有のトークン名を生成し、 'upvar#0 $ token ary;を使ってグローバル配列を呼び出すこともできます。 $ ary(これ)と$ ary(それ) 'で何かする。これがTclの 'http'パッケージの仕組みです。 –