2011-06-23 9 views

Respuesta

11

Sí, pero no puede usar llaves ({}) para su lista de argumentos. Usted declara el procedimiento, p. de esta manera:

proc log [list message [list output $::output]] { 
    .... 
} 

Pero tenga en cuenta:
La variable se evalúa en el momento en que se declare el procedimiento, no cuando se ejecuta!

+2

+1: Eso es perfecto para los valores por defecto en tiempo definición. –

7

Si desea un argumento predeterminado que solo está definido en el valor en el momento de la llamada, tiene que ser más complicado. La clave es que se puede utilizar info level 0 para obtener la lista de argumentos para la llamada al procedimiento actual, y entonces sólo comprobar la longitud de la lista:

proc log {message {output ""}} { 
    if {[llength [info level 0]] < 3} { 
     set output $::output 
    } 
    ... 
} 

Recuerde, al comprobar la lista de argumentos, el primero es el nombre del comando en sí.

+0

+1 para verificar el número de argumentos provistos, frente a solo verificar si la salida fue la cadena vacía. Bueno, obtendrías un +1 para la respuesta útil independientemente, pero me alegro de que lo hicieras así :) – RHSeeger

+0

Excelente respuesta, pero ten cuidado de que de esta manera no puedas discriminar entre un usuario que da el comando 'log hello' "'y' log hello '. Puedes cambiar la cadena de salida predeterminada (cambiando "") pero luego obtienes un problema similar con el nuevo valor. Puede que no ocurra a menudo, pero cuando sucede ... – Roalt

+0

@Roalt: ¿Quisiste poner ese comentario en la otra respuesta? Con el mío, puedes distinguir simplemente contando cuántos valores se han proporcionado realmente. Es fácil. –

1

Otra manera de hacer esto:

proc log {message {output ""}} { 
    if {$output eq ""} { 
     set output $::output 
    } 
} 
Cuestiones relacionadas