命名空间必须是纯文本,它不能是元素,如变量或嵌套脚本。例如。你无法做到以下几点:
set ns ::my_ns
set ::my_ns::var1 100
puts ${$ns}var1 <== wrong
puts $$nsvar1 <== wrong
你能证实吗?
答案 0 :(得分:2)
这有效:
% namespace eval my_ns { set var1 100 }
100
% incr ::my_ns::var1
101
% set ns ::my_ns
::my_ns
% puts [set ${ns}::var1]
101
答案 1 :(得分:1)
您无法使用$
语法执行此操作;这是一个句法限制。您必须使用类似set
的单参数形式:
puts [set ${ns}::var1]
但是 如果你在一个程序中,你有一个更好的选择。 namespace upvar
命令可以很好地处理这类事情:
proc printVariable {ns} {
namespace upvar $ns var1 v
puts $v
}
另外,如果你这样做是为了模拟对象系统,请停止。请改用真实对象系统(例如,TclOO,它作为Tcl 8.6的内置部分提供)。