如何在 TCL 中编写使用全局字典或另一个字典的过程

问题描述 投票:0回答:1

我有一个使用全局字典的程序。它是一个全局的,因为我需要该过程能够读取字典并更新它。

我需要能够使用这个全局字典 dict_glob1 或另一个字典 dict_glob2,具体取决于过程的参数。

我可以提供正确的字典作为参数,但我担心我将无法更新它。事实上,我想我只需要提供全局字典的“名称”。但我不知道如何将字典的“名称”与程序内的真实字典链接起来。

tcl global
1个回答
0
投票

最简单的方法是使用

upvar
(加上解码参数所需的任何逻辑)为您想要在过程中访问/更新的变量提供一致的本地名称。这使得设置
upvar
调用的复杂性保持在附近;之后的一切都很简单(或者至少和需要的一样复杂)。

这是一个人为的版本(

d
只是一个局部变量名称,有点助记“字典”):

proc doTheThing {{argument "foo"}} {
    if {$argument eq "foo"} {
        upvar "#0" dict_glob1 d
    } else {
        upvar 1 dict_glob2 d
    }

    dict set d abc 123
}

调用者始终将变量名作为参数传递是更正常。如果愿意,他们可以命名全局变量。在这种情况下,你会得到:

proc doTheThing {{varName "::dict_glob1"}} {
    upvar 1 $varName d
    dict set d abc 123
}

在这种情况下,我们将全局变量命名为默认参数,但调用者可以将其重写为他们喜欢的任何其他名称(命名空间或在其范围内)。

© www.soinside.com 2019 - 2024. All rights reserved.