TCL如何调用项处理程序
我创建了从项目到项目处理程序的映射TCL如何调用项处理程序,tcl,Tcl,我创建了从项目到项目处理程序的映射 array set handlers { handleItem1 handlerFunction1 handleItem2 handlerFunction2 } 但是handler函数可以接受参数 所以下面的代码是行不通的 if { [info exists handlers($item) ] } { eval $this $handlers($item) } 因此,我是否可以将
array set handlers {
handleItem1 handlerFunction1
handleItem2 handlerFunction2
}
但是handler函数可以接受参数
所以下面的代码是行不通的
if { [info exists handlers($item) ] } {
eval $this $handlers($item)
}
因此,我是否可以将此代码更改为能够调用可以获取参数的处理程序?有几个选项:
- 命令前缀如果您使用的是Tcl 8.5或更高版本(8.4即将结束,如果可能,请升级),那么使用
进行命令扩展是最好的方法{*}
proc putargs args {puts $args} set callback {putargs CALLBACK} # Invoke it {*}$callback param1 param2 ;# prints CALLBACK param1 param2
- 脚本片段评估回调,但在末尾添加额外的单词。(trace会这样做)
允许像
这样的黑客操作,它将忽略行的其余部分,但速度较慢set callback{puts“callback”#}
- 命令不是很有用,因为您无法传递任何内容
proc putargs args {puts $args} set callback {putargs CALLBACK} # Invoke {*}$callback ;# prints CALLBACK
- 脚本参数在当前范围内作为变量传递,有时还使用字符串替换(Tk会这样做)
- 命令名与命令前缀类似,但不进行扩展。(Tcllib的SASL为自己的机制实现了这一点)。不推荐
proc putargs args {puts $args} set callback putargs # Invoke $callback param1 param2
具有最佳性能的最佳解决方案是命令前缀。我建议使用命令前缀,并使用
{*}
调用它们。你能举个例子吗,我该怎么做?
proc putargs args {puts $args}
set callback {putargs CALLBACK $param1 $param2}
# Invoke
set param1 FOO
set param2 BAR
eval $callback ;# prints CALLBACK FOO BAR
proc putargs args {puts $args}
set callback putargs
# Invoke
$callback param1 param2