«набор» против «переменной» в Tcl

afaik, есть два способа создать и назначить переменную в пространстве имен в Tcl:

namespace eval ::myspace:: {
  variable foo 1
}
set ::myspace::bar 2

на самом деле, эти два эквивалента:

info vars ::myspace::*
# ::myspace::foo ::myspace::bar

Некоторое время я задавался вопросом, действительно ли они эквивалентны (и какая из них предпочтительнее).

Я почти уверен об этом уже спрашивали и уже отвечали

Filburt 29.04.2024 11:20

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

TrojanName 29.04.2024 12:56

@Filburt, наверное, об этом уже спрашивали и уже отвечали. Тем не менее, я провел предварительное исследование, прежде чем задать вопрос (очевидно, сверившись с документацией Tcl и выполнив веб-поиск практически по тем поисковым запросам, которые вы использовали), и не смог идентифицировать такой повторяющийся вопрос (не говоря уже о ответ на вопрос) - как вы наверняка знаете, иначе вы, надеюсь, просто проголосовали бы за закрытие этого вопроса, указав на дубликат.

umläute 29.04.2024 13:36

Я вижу, что @Filburt и несколько других закрыли этот вопрос. Я не думаю, что это разумно и доброжелательно, и проголосовал за возобновление работы.

TrojanName 29.04.2024 17:15

@Filburt Если вопрос уже задавался ранее, вам следует проголосовать за закрытие как дубликат, а не голосовать за закрытие как на основе мнения: спросить, эквивалентны ли две синтаксические формы по эффекту/поведению или могут ли они иметь (тонкие?) различия не спрашивает мнений.

Mark Rotteveel 05.05.2024 12:08
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
0
5
139
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Команда set — это базовая операция. Если вы дадите ему два аргумента, он разрешит переменную с именем, обычно предпочитая локальную переменную всему остальному, и записывает значение в переменную, возвращая содержимое переменной. (Обычно это то же самое, что и записанное вами значение.) С одним аргументом вместо этого считывается переменная.

Команда variable гарантирует, что это имя будет преобразовано в переменную с этим именем в текущем пространстве имен; в контексте с локальными переменными (внутри процедуры или метода) он создает ссылку из локальной переменной с этим именем на разрешенную переменную пространства имен. И также можно написать простую переменную, если вы укажете значение. Он может обрабатывать несколько переменных... но я не так часто им пользуюсь. Имеет пустой результат.

Если вы используете полное имя переменной с set, вы можете напрямую записать любую переменную пространства имен. Это просто другой способ поиска лежащей в основе реальности; переменные — это не их имена, в конце концов, имя — это всего лишь способ найти переменную.

Механизм связи также используется global, upvar и namespace upvar. Это очень быстро (после формирования), обычно требующее одного дополнительного отклонения в механизме байт-кода.

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

umläute 29.04.2024 14:12

Лучший стиль? Зависит от того, что вы об этом думаете. В этом случае я бы, наверное, использовал variable; Я доволен вложением вещей. Но использование полной формы совершенно не является неправильным; Я использую это, например, для глобальных переменных env и tcl_platform.

Donal Fellows 30.04.2024 14:46

Другие вопросы по теме