gpt4 book ai didi

tcl - upvar 命令在 TCL 中是如何工作的?

转载 作者:行者123 更新时间:2023-12-04 00:42:37 27 4
gpt4 key购买 nike

我对 TCL 中的 upvar 命令有疑问。使用 upvar 命令,我们可以在其他过程中引用全局变量或局部变量。我看到了以下代码:

proc tamp {name1 name2} {
upvar $name1 Ronalod
upvar $name2 Dom
set $Dom "Dom"
}

此过程称为 tamp name1 name2 ,并且没有在它之外定义全局变量 name1、name2,这个 upvar 在这种情况下是如何工作的?

最佳答案

当你调用 upvar 1 $foo bar 时,它会在调用者的作用域中找到名称在 foo 变量中的变量,并将本地变量 bar 变成它的别名。如果变量不存在,则在未设置状态下创建它(即,变量记录存在但没有值。实际上,实现使用 NULL 来表示该信息,这就是为什么 Tcl 没有 NULL 等价物; NULL 表示不存在)但仍会创建链接。 (只有当局部作用域被破坏或使用 upvar 将局部变量指向其他东西时,它才会被拆除。)

所以让我们看看你的代码到底在做什么:

proc tamp {name1 name2} {
upvar $name1 Ronalod
upvar $name2 Dom
set $Dom "Dom"
}

第一行说我们正在创建一个名为 tamp 作为过程的命令,该过程将有两个强制性的形式参数,并且这些参数称为 name1name2

第二行说我们在调用者中绑定(bind)了一个变量名(我之前解释中的 1 级别指示符是可选的,但在惯用代码中强烈建议使用),它由 name1 变量(即过程的第一个参数)给出) 到局部变量 Ronalod 。此后,对该局部变量的所有访问(直到堆栈帧生命周期结束)实际上都将在调用者中的绑定(bind)变量上执行。

第三行几乎相同,除了 name2(第二个参数)和 Dom(局部变量)。

第四行实际上很时髦。它读取 Dom 变量以获取变量名(即,在过程调用的第二个参数中命名的变量)并将该命名变量设置为值 Dom 。请记住,在 Tcl 中,您使用 $ 来读取变量,而不是谈论变量。

过程调用的结果将是其主体中最后一个命令的结果(即,文字 Domset 产生变量的内容作为其结果,它刚刚分配的值)。 (最后一行完全没意思,因为它只是程序主体的结尾。)

调用此命令的最终结果实际上几乎什么都没有,除非第二个参数命名一个包含 RonalodDom 的变量。这很令人困惑。当然,令人困惑的地方实际上是带有可变第一个参数的时髦的 set。 (这几乎总是一个坏主意;它是不良代码气味的一个指标。)如果您改用它,事情会更简单:
set Dom "Dom"

在这种情况下,与 Dom 耦合的变量(即过程的第二个参数命名的变量)将设置为 Dom ;这些变量实际上是通过引用传递的。额外的 $ 有很大的不同!

关于tcl - upvar 命令在 TCL 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11047931/

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