нам нужно "сбросить" переменные в TCL? - PullRequest
5 голосов
/ 25 февраля 2010

Требуется ли хороший код TCL? Что произойдет, если мы не используем ключевое слово «unset» в скрипте? Какие-нибудь побочные эффекты, о которых я должен знать?

Я унаследовал некоторый унаследованный код, и ошибки, возникающие из-за «неустановленных» несуществующих переменных, приводят меня в движение!

Ответы [ 4 ]

9 голосов
/ 25 февраля 2010

Можно определить, существует ли переменная перед ее использованием, с помощью команды info exists. Убедитесь, что если вы не используете unset, вы не нарушите логику программы где-то еще.

Нет особой причины для Tcl unset переменной, то есть она не приведет к утечке памяти, исчерпанию дескрипторов переменных или чему-то сумасшедшему. Использование unset может быть защитной практикой программирования, поскольку она предотвращает использование переменной в будущем, когда она больше не актуальна. Не зная точного кода, с которым вы работаете, трудно дать более подробную информацию.

2 голосов
/ 26 февраля 2010

В дополнение к другим ответам, если ваша версия Tcl достаточно новая, вы также можете использовать:

unset -nocomplain foo

Это будет сбрасывать foo, если оно существует, но не будет жаловаться, если оно не существует.

Jeff

1 голос
/ 27 февраля 2014

Зависит от системной статистики, которая может вызвать проблему «невозможно выделить байты», когда ваш скрипт хранит огромные данные в переменных и массивах. он сломается, как только кеш или ОЗУ заполнятся, говоря «невозможно выделить XXXXXXXX байт».

Убедитесь, что вы не храните столько данных в переменных, в противном случае не устанавливайте их после окончания использования соответствующих наборов данных (переменных)

0 голосов
/ 03 марта 2010

Для заметки, поскольку я не могу прокомментировать вышеприведенную «информацию существует»;

Я часто использую эту форму ..

if { [info exists pie] && [$pie == "ThisIsWhatIWantInPie"]} {
    puts "I found what I wanted in pie."
} else {
    puts "Pie did not exist; but I still did not error,TCL's evaluation \
          will see the conditional failed on the [info exists] and not \
          continue onto the comparison."
}
...