Tcl中的命名空间变量范围与过程

时间:2014-07-29 05:20:14

标签: namespaces tcl scope

在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

为什么这样做?

在程序中声明变量的意义是什么?

1 个答案:

答案 0 :(得分:3)

这是语言设计的选择。 Tcl使用动态范围而不是词法范围,因此即使proc定义在词法上是namespace eval主体的一部分,名称也不会自动导入到任何地方。全局名称也是如此,除非您使用proc,否则不会将其导入global定义。请注意,这有两种方式:如果您碰巧更改了与命名空间或全局变量同名的变量,则除非您需要更改,否则您的更改不会泄漏(请记住Tcl使用隐式变量声明:{ {1}}只有在未使用名称时才会创建新变量。

记住在需要它们的每个程序中放入set命令都很麻烦,当你忘记时很容易得到晦涩的错误,但总的来说,这是一个合理的设计选择。

文档:globalnamespaceprocsetvariable