gpt4 book ai didi

namespaces - 带有过程的 Tcl 中的命名空间变量范围

转载 作者:行者123 更新时间:2023-12-04 16:59:21 25 4
gpt4 key购买 nike

在 Tcl 中,我正在尝试处理 namespace ,但我遇到了以下问题。

我的代码如下。

% 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

为什么会这样?

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

最佳答案

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

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

文档: globalnamespaceprocsetvariable

关于namespaces - 带有过程的 Tcl 中的命名空间变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25008684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com