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

时间:2019-05-14 08:02:20

标签: 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%

我已在线复制了该问题:http://tpcg.io/3SIBYG

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

我使用:

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

1 个答案:

答案 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}}可以找到变量并将其写入。