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