TCL 变量作用域:访问命令内声明的变量



我对TCL的可变范围规则感到困惑,这里有一个实验:

if {2 > 1} {
    set x 100
}
proc p1 {} {
    set y 200
}
puts $x
p1
puts $y

运行脚本给我:

100
can't read "y": no such variable
    while executing
"puts $y"

这让我感到困惑:关于$y的错误是有意义的,因为 y 是在 proc 内部定义的,所以在 proc 外部无法访问它。问题是x,为什么可以访问它?它在"if"命令的嵌套脚本中定义。

从我习惯性思维的角度来看,C++没有意义。TCL是否对命令"proc"进行了特殊处理,以便在其嵌套脚本中声明的变量与其他变量的处理方式不同,例如"if","for"等?

顺便说一句,我知道如何使其工作,只是想了解关于变量范围的 TCL 规则。

Tcl 中唯一的作用域是在 proc 或命名空间eval 内。

大括号是容器(脚本或字符串),而不是组,并且不定义新作用域。

if 语句由以下部分组成:if后跟一个 expr,后跟一个主体exprbody 都只是包含表达式和脚本的字符串。

请记住,Tcl 不是 Algol 派生语言,您不能将规则从 C 转移到 Tcl。

最新更新