全局关键字在TCL中的使用

全局关键字在TCL中的使用,tcl,global,Tcl,Global,我有一个关于TCL的global的问题。 在一个tcl文件tclone.tcl中,我有一个全局变量:global SIGNAL 在另一个名为tclttwo.tcl的tcl文件中,我将变量信号设置为:set SIGNAL 10 在tclone.tcl中,我改进了tclttwo.tcl,如下所示“包需要tclttwo.tcl 执行tclone.tcl中的变量信号是否会设置为10?gloable变量的用途是什么?如中所述,global命令仅在程序体内有意义: 除非在proc主体的上下文中执行,否则此命

我有一个关于TCL的
global
的问题。 在一个tcl文件tclone.tcl中,我有一个全局变量:
global SIGNAL

在另一个名为tclttwo.tcl的tcl文件中,我将变量信号设置为:
set SIGNAL 10

在tclone.tcl中,我改进了tclttwo.tcl,如下所示“
包需要tclttwo.tcl
执行tclone.tcl中的变量信号是否会设置为10?gloable变量的用途是什么?

如中所述,
global
命令仅在程序体内有意义:

除非在proc主体的上下文中执行,否则此命令无效

因此,整个问题还不清楚。如果您的意思是第一个文件中有一个proc设置了一个全局变量,另一个proc(在第二个文件中)正在读取它,那么这个问题是有意义的,答案是肯定的,第二个文件中的代码将看到第一个文件中的代码在提供“设置”的情况下所做的更改“获取”过程在“获取”过程之前运行。更清楚地说,全局变量相对于解释器是全局的,操作该变量的代码运行。因此,无论您使用哪种方式将代码提取到解释器中(
package require
vs
source
vs
eval
等),所有这些代码都将看到相同的全局变量集


但是在任何情况下,您都应该避免使用全局变量并使用名称空间变量:它们也是全局变量,但是您可以大大降低以后引入其他代码的风险,这些代码会无意中弄乱它不应该接触的全局变量。当然,通常这取决于应用程序的复杂程度。

顺便说一句,变量的名称表明您可能打算使用它在程序的不同部分之间进行某种同步。如果是这样的话,您可能应该看看uevent(),而不是重新发明轮子。问题是:第一个文件的proc中有一个全局信号,第二个文件中有一个set信号10,但不在proc中,因此,我导入了第二个文件,因为下面的包需要tclttwo.tcl。当我执行它时,第一个文件中的变量信号会被设置为10吗?@ratzip,这取决于该
设置信号10
:如果在顶层调用此命令(即,不在任何
名称空间eval foo…
或类似名称空间中,答案是肯定的。如果在某个过程中调用该命令,该过程在设置命令本身之前执行了
全局信号
,则答案也是肯定的。总而言之:命令
设置信号10
的结果取决于它看到的上下文。同样
set::SIGNAL 10
将始终设置全局变量“SIGNAL”,无论它在什么上下文中。全局变量是应用程序的“属性”;包应使用自己的命名空间(特别是对于变量)。