2017-06-01 1 views
1

Dans mes scripts, lorsque j'utilise une variable, je vide généralement le contenu d'une variable pour m'assurer que la liste est propre. Quelque chose comme ce qui suitdans Tcl, quand utiliser set set vs unset pour se préparer à utiliser une variable

set var1 [list] 
foreach var2 {a b c} { 
    lappend var1 $var2 
} 

Mais il semble que la première variable MHS réaliserait la même chose. Quelque chose comme ça

unset -nocomplain var1 
foreach var2 {a b c} { 
    lappend var1 $var2 
} 

Y at-il un avantage à utiliser l'un par rapport à l'autre?

Répondre

2

Cela ne fait aucune différence dans ce cas. Si je devais écrire une telle boucle dans mon propre code, je serais plus susceptible d'utiliser set var {} puisque c'est le littéral de liste vide (en plus d'être la chaîne vide, le dictionnaire vide, le script vide, etc.) mais n'est pas une différence de temps d'exécution à proprement parler. Cela reflète juste ce que je pense des scripts.

Bien sûr, si vous faites quelque chose là où c'est important, utilisez le bon pour ce cas.

+0

merci. Mais dans quelle situation cela ferait-il une différence? – Jonjilla

+0

Peut-il faire une différence dans la représentation interne et chatoyante? –

+0

Les situations où cela ferait une différence seraient celles où vous alliez lire la variable en premier, et bien sûr 'info existe' verrait la différence aussi. Il y a aussi quelques subtilités lorsque l'on travaille dans 'namespace eval' (hélas, un défaut de longue date). La plupart du temps, il suffit d'écrire ce qui a du sens. –

0

Comme Donal a écrit, set var {}. En interne, la même valeur sera affectée indépendamment du fait que vous affectez {}, [list] etc. Oui, il va scintiller, et non, ce ne sera pas un problème.

En ce qui concerne set vs unset: alors que vous pouvez les utiliser comme bon vous semble, ils servent principalement des modèles différents. Dans le modèle assign-empty-value, vous souhaitez qu'une variable soit prête pour l'écriture ou la lecture, avec une valeur vide prédéfinie. Dans le motif remove-from-scope, vous voulez que le nom soit inutilisé (il ne sera pas inutilisable: vous pouvez toujours l'assigner/créer). Sauf si vous êtes après quelque chose comme le deuxième modèle, vous n'aurez probablement pas beaucoup d'utilisation sérieuse pour unset.