2011-06-23 3 views

Répondre

11

Oui, mais vous ne pouvez pas utiliser d'accolades ({}) pour votre liste d'arguments. Vous déclarez la procédure par ex. de cette façon:

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

Mais attention:
La variable est évaluée au moment où la procédure est déclarée, pas quand il est exécuté!

+2

+1: qui est parfait pour les valeurs par défaut définition en temps. –

7

Si vous voulez un argument par défaut défini uniquement en valeur au moment de l'appel, vous devez être plus compliqué. La clé est que vous pouvez utiliser info level 0 pour obtenir la liste des arguments à l'appel de la procédure en cours, et vous vérifiez que la longueur de cette liste:

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

Rappelez-vous, lors de la vérification de la liste des arguments, le premier est le nom de la commande elle-même.

+0

+1 pour vérifier le nombre d'arguments fournis, vs simplement vérifier si la sortie était la chaîne vide! Eh bien, vous obtiendrez un +1 pour la réponse utile, mais je suis content que vous l'ayez fait :) – RHSeeger

+0

Excellente réponse, mais attention, de cette façon, vous ne pouvez pas faire la distinction entre un utilisateur qui donne la commande 'log salut' "'et' connectez-vous bonjour '. Vous pouvez changer la chaîne de sortie par défaut (en changeant "") mais vous obtenez un problème similaire avec la nouvelle valeur. Peut ne pas arriver souvent mais quand cela arrive ... – Roalt

+0

@Roalt: Vouliez-vous dire de mettre ce commentaire sur l'autre réponse? Avec le mien, vous pouvez distinguer simplement _counting_ combien de valeurs ont été réellement fournies. C'est si facile. –

1

Une autre façon de le faire:

proc log {message {output ""}} { 
    if {$output eq ""} { 
     set output $::output 
    } 
} 
Questions connexes