在Tcl中,我正在尝试使用名称空间,我遇到了以下问题。
我的代码如下。
% namespace eval counter {
#Declaring the variable 'num' in counter namespace
variable num 0
proc next { } {
#Accessing 'num' here, since we have already declared it in it's namespace
return [ incr num ]
}
proc reset { } {
#Same as above
return [ set num 0 ]
}
}
%########OUTPUT############
% ::counter::next
1
% ::counter::next
1
% ::counter::reset
0
% ::counter::next
1
正如您所看到的,我可以访问值' num'没有任何问题。但是,价值' num'保留每次通话的价值。
通过声明变量' num'在每个程序中,保留了值。
% namespace eval counter {
variable num 0
proc next { } {
variable num
return [ incr num ]
}
proc reset { } {
variable num
return [ set num 0 ]
}
}
% ######OUTPUT#########
% ::counter::next
1
% ::counter::next
2
% ::counter::next
3
% ::counter::reset
0
为什么这样做?
在程序中声明变量的意义是什么?
答案 0 :(得分:3)
这是语言设计的选择。 Tcl使用动态范围而不是词法范围,因此即使proc
定义在词法上是namespace eval
主体的一部分,名称也不会自动导入到任何地方。全局名称也是如此,除非您使用proc
,否则不会将其导入global
定义。请注意,这有两种方式:如果您碰巧更改了与命名空间或全局变量同名的变量,则除非您需要更改,否则您的更改不会泄漏(请记住Tcl使用隐式变量声明:{ {1}}只有在未使用名称时才会创建新变量。
记住在需要它们的每个程序中放入set
命令都很麻烦,当你忘记时很容易得到晦涩的错误,但总的来说,这是一个合理的设计选择。