我从项目到项目处理程序创建了地图。
array set handlers {
handleItem1 handlerFunction1
handleItem2 handlerFunction2
}
但是handlerFunctions可以带参数。
所以下面的代码不会起作用。
if { [info exists handlers($item) ] } {
eval $this $handlers($item)
}
那么我可以使用这个代码来调用可以获取参数的处理程序吗?
答案 0 :(得分:7)
有几种选择:
命令前缀如果您使用的是Tcl 8.5或更高版本(8.4在其生命周期的末尾,请尽可能升级),那么使用{*}
的命令扩展是最好的这样做的方法。
proc putargs args {puts $args}
set callback {putargs CALLBACK}
# Invoke it
{*}$callback param1 param2 ;# prints CALLBACK param1 param2
脚本片段评估回调,但最后添加额外的字词。 (追踪就是这样)
proc putargs args {puts $args}
set callback {putargs CALLBACK [clock seconds]}
# Invoke
eval $callback [list param1 param2] ;# Prints CALLBACK 1369834114 param1 param2
允许像set callback {puts "CALLBACK" ;#}
这样的黑客会忽略该行的其余部分,但速度较慢。
命令不是很有用,因为你无法传递任何东西。
proc putargs args {puts $args}
set callback {putargs CALLBACK}
# Invoke
{*}$callback ;# prints CALLBACK
脚本该参数作为当前作用域中的变量传递,有时也使用字符串替换(Tk执行此操作)
proc putargs args {puts $args}
set callback {putargs CALLBACK $param1 $param2}
# Invoke
set param1 FOO
set param2 BAR
eval $callback ;# prints CALLBACK FOO BAR
命令名称与命令前缀类似,但不进行扩展。 (Tcllib的SASL为自己的机制做了这一点)。不推荐。
proc putargs args {puts $args}
set callback putargs
# Invoke
$callback param1 param2
具有最佳性能的最佳解决方案是命令前缀。