名称空间可以变量

时间:2016-05-03 12:59:34

标签: tcl

命名空间必须是纯文本,它不能是元素,如变量或嵌套脚本。例如。你无法做到以下几点:

set ns ::my_ns
set ::my_ns::var1 100
puts ${$ns}var1     <== wrong
puts $$nsvar1     <== wrong

你能证实吗?

2 个答案:

答案 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的内置部分提供)。