TCL: использование переменной имени пространства имен

#variables #namespaces #tcl

#переменные #пространства имен #tcl

Вопрос:

Я создаю пространство имен, в котором имя содержится в одной переменной:

 set fg_path fg_$path
namespace eval $fg_path {
    variable Elem 17
    puts "--> [namespace current]"
}
 

Но я не могу получить доступ к значению элемента или установить его, например, это не работает:
set ::$fg_path::Elem [dict create]

Спасибо за любое предложение. Джон

Ответ №1:

Вы должны быть осторожны при сборке квалифицированного имени переменной:

 set ::${fg_path}::Elem [dict create]
 

Обратите внимание на фигурные скобки { и } которые защищают переменную fg_path для замены переменной. Без них вы бы попросили Tcl выполнить подстановку для переменной с именем fg_path::Elem .

Ответ №2:

Составные имена (и другие ошибки синтаксического анализа) возникают, когда вы используете фигурные скобки вокруг имен переменных. set ::${fg_path}::Elem [dict create]

Но если вы работаете в процедуре, пожалуйста, используйте namespace upvar вместо:

 proc set_elem {fg_path to} {
    namespace upvar $fg_path Elem vbl
    set vbl $to
}

set_elem $fg_path [dict create]
 

Это немного многословно для данного конкретного случая, но это очень хорошо в более длинном реальном коде.