2013-05-29 13 views
5

Ho creato la mappa dall'elemento al gestore di elementi.TCL come chiamare i gestori di articoli

array set handlers { 
      handleItem1 handlerFunction1 
      handleItem2 handlerFunction2 
    } 

Ma handlerFunctions potrebbe richiedere parametri.

Quindi sotto il codice non funzionerà.

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

Quindi, è possibile modificare questo codice per poter chiamare i gestori che potrebbero utilizzare i parametri?

+0

Suggerisco di usare prefissi di comando e di invocarli con '{*}'. –

+0

[Johannes Kuhn] (http://stackoverflow.com/users/845414/johannes-kuhn) Potresti mostrare un esempio, come posso farlo? –

risposta

7

Ci sono diverse opzioni:

  • Comando prefisso Se si utilizza Tcl 8.5 o versione successiva (8.4 si trova alla fine della sua vita, l'aggiornamento se possibile), allora l'espansione comando con {*} è il il modo migliore per farlo.

    proc putargs args {puts $args} 
    set callback {putargs CALLBACK} 
    # Invoke it 
    {*}$callback param1 param2 ;# prints CALLBACK param1 param2 
    
  • frammento di script Eval la richiamata, ma aggiungere parole extra alla fine. (Traccia lo fa)

    proc putargs args {puts $args} 
    set callback {putargs CALLBACK [clock seconds]} 
    # Invoke 
    eval $callback [list param1 param2] ;# Prints CALLBACK 1369834114 param1 param2 
    

    Consente hack come set callback {puts "CALLBACK" ;#} che ignorerà il resto della linea, ma è più lento.

  • Comando Non molto utile perché non è possibile passare nulla.

    proc putargs args {puts $args} 
    set callback {putargs CALLBACK} 
    # Invoke 
    {*}$callback ;# prints CALLBACK 
    
  • Script Il parametro vengono passati come variabili nell'ambito corrente, a volte anche con la sostituzione di stringhe (Tk fa quel)

    proc putargs args {puts $args} 
    set callback {putargs CALLBACK $param1 $param2} 
    # Invoke 
    set param1 FOO 
    set param2 BAR 
    eval $callback ;# prints CALLBACK FOO BAR 
    
  • Nome comando come il prefisso di comando, ma nessuna espansione è fatta. (SASL del Tcllib lo fa per i propri meccanismi). Non consigliato.

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

La soluzione migliore con la migliore performance è il prefisso di comando.

Problemi correlati