2013-05-29 8 views
5

アイテムからアイテムハンドラーまでマップを作成しました。TCLアイテムハンドラーを呼び出す方法

array set handlers { 
      handleItem1 handlerFunction1 
      handleItem2 handlerFunction2 
    } 

しかし、handlerFunctionsはパラメータを取ることができます。

以下のコードは動作しません。

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

このコードを変更して、パラメータを取ることができるハンドラを呼び出すことができますか?

+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 
    

最高のパフォーマンスと最高のソリューションは、コマンドの接頭辞です。

関連する問題