使用「;“跟踪添加变量读取”;在tcl

使用「;“跟踪添加变量读取”;在tcl,tcl,Tcl,tcl新手,正在尝试理解“trace add variable”命令 我理解在“写入”变量时调用回调函数的必要性 但是“读取”选项有什么用呢?用于调试 一个示例使用可能是全局计数器: proc init { } { set ::globalcounter 0 trace add variable ::globalcounter read ::gcountUpdate } proc gcountUpdate { } { incr ::globalcounter } proc mai

tcl新手,正在尝试理解“trace add variable”命令

我理解在“写入”变量时调用回调函数的必要性


但是“读取”选项有什么用呢?用于调试

一个示例使用可能是全局计数器:

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的got使用了这种机制,尽管它使用底层C 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
我不建议对局部变量使用变量跟踪。与全局/命名空间变量相比,它们的开销(和内部复杂性)要多得多