2013-05-29 23 views
5

我从物品到物品处理程序创建了地图。TCL如何打电话给物品处理员

array set handlers { 
      handleItem1 handlerFunction1 
      handleItem2 handlerFunction2 
    } 

但是handlerFunctions可以带参数。

所以下面的代码是不会工作的。

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

所以我可以chnage这个代码能够调用可以采取参数的处理程序?

+0

我建议使用命令前缀并用'{*}'调用它们。 –

+0

[Johannes Kuhn](http://stackoverflow.com/users/845414/johannes-kuhn)请你举个例子,我该怎么做? –

回答

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 
    

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