我有一个使用全局字典的程序。它是一个全局的,因为我需要该过程能够读取字典并更新它。
我需要能够使用这个全局字典 dict_glob1 或另一个字典 dict_glob2,具体取决于过程的参数。
我可以提供正确的字典作为参数,但我担心我将无法更新它。事实上,我想我只需要提供全局字典的“名称”。但我不知道如何将字典的“名称”与程序内的真实字典链接起来。
最简单的方法是使用
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
}
在这种情况下,我们将全局变量命名为默认参数,但调用者可以将其重写为他们喜欢的任何其他名称(命名空间或在其范围内)。