Вопрос по пространству имен в Tcl - PullRequest
3 голосов
/ 29 июня 2011

У меня два вопроса о пространстве имен в Tcl.

namespace eval ::dai {
         set a 5
         set b 10
         namespace export *
}

Мои вопросы:

  1. export * - при экспорте некоторая переменная внутри этого пространства имен может использоваться в другом пространстве имен, но что это означает export *?

  2. Установите 5, разве мы не должны использовать variable a 5? они одинаковы? некоторые учебники говорят, что внутри пространства имен мы должны использовать variable, в чем разница между variable и set в пространстве имен?

Ответы [ 2 ]

7 голосов
/ 29 июня 2011

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).

2 голосов
/ 29 июня 2011

namespace export применяется только к командам (т. Е. proc s) в пространстве имен: он регистрирует их как пригодные для импорта в другое пространство имен.Например:

% package require textutil
0.7.1
% textutil::splitx abcdefghij {[aeiou]}
{} bcd fgh j
% splitx abcdefghij {[aeiou]}
invalid command name "splitx"
while evaluating {splitx abcdefghij {[aeiou]}}
% namespace import textutil::*
% splitx abcdefghij {[aeiou]}
{} bcd fgh j
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...