在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 

我不推荐使用局部变量变量的痕迹。与全局/名称空间变量相比,它们有更多的开销(以及内部复杂性)。