TCL如何调用项目处理程序

时间:2013-05-29 13:11:53

标签: tcl

我从项目到项目处理程序创建了地图。

  array set handlers {
             handleItem1 handlerFunction1
             handleItem2 handlerFunction2
  }

但是handlerFunctions可以带参数。

所以下面的代码不会起作用。

 if { [info exists handlers($item) ] } {
       eval $this $handlers($item)
 }

那么我可以使用这个代码来调用可以获取参数的处理程序吗?

1 个答案:

答案 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
    

具有最佳性能的最佳解决方案是命令前缀。