无法定义TCL全局定义的命名空间变量
我无法在名称空间(在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% 我在网上转载了这
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}
}