#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]
Это немного многословно для данного конкретного случая, но это очень хорошо в более длинном реальном коде.