我无法在先前在全局范围内定义的名称空间(在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%
我已在线复制了该问题:http://tpcg.io/3SIBYG
如何独立于全局范围在命名空间中定义变量?
我使用:
答案 0 :(得分:2)
至少在第一次访问时,始终使用variable
命令在名称空间中定义变量,否则最终将以 namespace变量解析规则接管,使您的生活变得不愉快。它们很奇怪(尽管实际上与命令解析的工作原理非常相似),并且您几乎不需要它们,并且可能会在Tcl 9中将其删除。但是在那之前,您一直在做:
namespace eval ns {
variable foo 2
variable bar 3
}
或:
namespace eval ns {
variable foo
set foo 2
variable bar
set bar 3
}
如果您想做阵列,可以。这样做(仅对variable
使用一个参数):
namespace eval ns {
variable ary
array set ary {foo 2 bar 3}
}
variable
命令的实际作用是使名称空间中的变量处于unset
状态,这样当set
和{{ 1}}可以找到变量并将其写入。