在tcl中使用“trace add variable read”
问题描述:
tcl的新手和试图理解“trace add variable”命令。在tcl中使用“trace add variable read”
我明白当变量被“写入”时需要调用回调函数。
但是“读取”选项有什么用处?为了调试?
答
一个例子使用可能是一个全局计数器:
proc init { } {
set ::globalcounter 0
trace add variable ::globalcounter read ::gcountUpdate
}
proc gcountUpdate { } {
incr ::globalcounter
}
proc main { } {
init
puts $::globalcounter
puts $::globalcounter
}
main
我敢肯定还有其他的用途。正如你指出的那样,调试。
它可以被用于通过特定程序执行变量访问。
答
其中一个用于读取回调(其确实比写回调不太常见)的用法是将Tcl变量链接到C变量;读回调用于强制读取C变量并将Tcl变量同步到它。 (写回调将确保Tcl变量的更新被反映到C变量中。)Tcl的a built-in C API使用了这种机制,尽管它使用基础C API用于变量跟踪,而不是构建在Tcl API之上的Tcl API它。
你也可以使用一个读回调做一个明显的只读变量:
trace add variable foo read {apply {args {
upvar "#0" foo v
set v "definitely this"
}}}
puts $foo
set foo "that"
puts $foo
我不推荐使用局部变量变量的痕迹。与全局/名称空间变量相比,它们有更多的开销(以及内部复杂性)。