5

アイテムからアイテム ハンドラーへのマップを作成しました。

  array set handlers {
             handleItem1 handlerFunction1
             handleItem2 handlerFunction2
  }

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

したがって、以下のコードは機能しません。

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

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

4

1 に答える 1

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
    
  • コマンド名Command プレフィックスと同様ですが、展開は行われません。(Tcllib の SASL は、独自のメカニズムに対してそれを行います)。推奨されません。

    proc putargs args {puts $args}
    set callback putargs
    # Invoke
    $callback param1 param2
    

最高のパフォーマンスを実現する最適なソリューションは、コマンド プレフィックスです。

于 2013-05-29T13:39:19.237 に答える