次の状況を考慮してください。
namespace eval ::mydialog {}
proc ::mydialog::show {w varName args} {
upvar 1 $varName theVar
# now I can access theVar
# (1)
# code defining/creating my window
# here some widgets for user interaction are created,
# some of which will call ::mydialog::_someCallback
wm protocol $w WM_DELETE_WINDOW [list ::mydialog::close $w]
}
proc ::mydialog::_someCallback {} {
# how do I access theVar here?
# (2)
}
proc ::mydialog::close { w } {
# here some changes are supposed to be written back into varName in the calling scope,
# how do I do that?!
# (3)
destroy $w
}
(a) 呼び出しスコープから変数を取得する方法、(b) 3 つのすべての proc で使用できるようにする方法、および (c) 変更をその変数に書き戻す方法を理解しようとしています。
(a) 通常は 'upvar 1 $varName theVar' を使用して解決します (b) 通常は名前空間変数を使用して解決します (c) (a) で自動的に発生する proc が 1 つしかない限り、その変数のローカルエイリアスに取り組んでいます
問題は、upvar が (少なくとも意図したとおりに) (1) でのみ機能することです。(1) で upvar を使用し、名前空間変数に保存/コピーすると、(a) と (b) は解決できますが、(c) は解決しません。
ここで誰かが私を正しい方向に向けることができれば、私は感謝しています。
また、私は Tcl/Tk に比較的慣れていないため、私のコンセプトは理想的ではない可能性があります。より良い設計に向けた提案も歓迎します。