1) Как логично (предполагается, что) для пользователей Unix, «*» означает «все, что доступно в данный момент». Это похоже на то, когда вы делаете rm -f *
в оболочке, оболочка раскрывает «*» и заменяет ее списком всех файлов, присутствующих в текущем каталоге. На самом деле, как namespace
ручные состояния , вы можете указать более сложные шаблоны, чем простое "*". Чтобы узнать, что означает упомянутое здесь слово «стиль глобуса», прочитайте о string match
.
2) Вопрос "не должны ли мы использовать ..." является неправильным, поскольку он зависит от того, что вы хотите сделать. Если вы хотите объявить переменную, расположенную в пространстве имен, используйте variable
. Если вы хотите установить переменную, используйте set
, но учтите, что если эта переменная x
еще не существует в пространстве имен, Tcl попытается найти глобальную переменную с этим именем, см .:
% set x 5
5
% namespace eval foo {
set x 10
}
10
% set x
10
# ^^ observe that the global variable has been assigned
% namespace eval foo {
variable x
set x 20
}
20
% set x
10
# ^^ observe that now `set x 20` found the variable `x` in the namespace and assigned to it
Это объясняется в разделе «ИМЯ РАЗРЕШЕНИЕ» справочной страницы namespace
.
Обратите внимание, что это поведение может показаться нелогичным, но на самом деле оно соответствует области действия процедуры: если вы делаете set foo bar
в теле процедуры, это означает установку переменной local , если вы не указали иначе, используя global
или variable
или используя полное имя (например, ::ns::foo
).