2013-05-29 19 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 
    

具有最佳性能的最佳解決方案是命令前綴。