无法定义TCL全局定义的命名空间变量

无法定义TCL全局定义的命名空间变量,tcl,Tcl,我无法在名称空间(在TCL中)中定义变量,该名称空间以前是在全局范围中定义的。参见我的示例: xsct% $tcl_version [8.5] xsct% set foo 1 1 xsct% $foo [1] xsct% namespace eval ns { set foo 2 set bar 3 } 3 xsct% $::ns::bar [3] xsct% $::ns::foo can't read "::ns::foo": no such variable xsct% 我在网上转载了这

我无法在名称空间(在TCL中)中定义变量,该名称空间以前是在全局范围中定义的。参见我的示例:

xsct% $tcl_version
[8.5]
xsct% set foo 1
1
xsct% $foo
[1]
xsct% namespace eval ns {
set foo 2
set bar 3
}
3
xsct% $::ns::bar
[3]
xsct% $::ns::foo
can't read "::ns::foo": no such variable
xsct%

我在网上转载了这个问题:

如何独立于全局范围在名称空间中定义变量

我使用:

  • Win10
  • Xilinx的XSCT TCL控制台中的TCL 8.5

至少在您第一次访问变量时,始终使用
variable
命令在名称空间中定义变量,否则,名称空间变量解析规则将接管并使您的生活变得不愉快。它们很奇怪(尽管实际上与命令解析的工作原理非常相似),而且您实际上从来都不想要它们,并且可能在TCL9中被删除。但在那之前,你一直在做:

namespace eval ns {
    variable foo 2
    variable bar 3
}
或:

如果你想做数组,你可以。这样做(对
变量只有一个参数)


variable
命令实际做的是使命名空间中的变量处于
unset
状态,这样当
set
array
等命令可以找到变量并写入时,它仍然可以解析。

命名空间变量解析规则有时被Tcl的开发人员称为Tcl阁楼上疯狂的阿姨们。你真的不想处理它们,它们的存在已经导致了一些微妙的错误,甚至在过去的Tcl实现中也是如此,因为它们对人们是多么的不敏感…
namespace eval ns {
    variable foo
    set foo 2
    variable bar
    set bar 3
}
namespace eval ns {
    variable ary
    array set ary {foo 2 bar 3}
}