【问题标题】:Namespace's vairable scope in Tcl with procedures带有过程的 Tcl 中的命名空间变量范围
【发布时间】:2014-09-20 10:24:56
【问题描述】:

在 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

为什么会有这种行为?

在程序内部也声明变量有什么意义?

【问题讨论】:

    标签: namespaces tcl scope


    【解决方案1】:

    这是一种语言设计选择。 Tcl 使用动态而不是词法范围,因此即使proc 定义在词法上是namespace eval 主体的一部分,名称也不会自动导入任何地方。全局名称也是如此,除非您使用 global,否则它们不会导入到 proc 定义中。请注意,这是双向的:如果您碰巧对与命名空间或全局变量同名的变量进行更改,您的更改不会泄漏,除非您希望它们泄漏(请记住 Tcl 使用变量的隐式声明:@ 987654330@ 只会在名称未被使用时创建一个新变量)。

    记住在每个需要它们的程序中输入variable 命令可能会很麻烦,而且当你忘记时很容易得到模糊的错误,但总的来说,我认为这是一个合理的设计选择。

    文档:globalnamespaceprocsetvariable

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      相关资源
      最近更新 更多