gpt4 book ai didi

arrays - 重命名全局数组 TCL

转载 作者:行者123 更新时间:2023-12-01 11:22:55 24 4
gpt4 key购买 nike

我有一个全局数组,我需要重命名它,但似乎无法正确命名。

array set DataReturn {
red 1
green 5
blue 4
white 9
}

proc _RenameArray {Arr NewArrName} {
global $NewArrName
upvar #0 $Arr $NewArrName
array unset $Arr
}

_RenameArray DataReturn TheArr

我知道我在这里遗漏了很多东西。任何帮助将不胜感激!

最佳答案

这取决于。 Tcl 变量不能重命名,不是真的,但实际上它们可以有多个名称。你用 upvar 制作它们。特别是,upvar 0 将为当前作用域中的变量赋予另一个名称。

upvar 0 DataReturn TheArr

在幕后,这使 TheArr 成为一个链接变量;它的实际内容是指向另一个变量(当然可以是数组)的指针,但是对链接变量的任何操作都会转换为对基础变量的操作(除了将链接更改为指向其他内容之外)。这不是重命名的唯一方法是原始变量仍然存在并且无法删除。

如果您做不到,您唯一的选择是将该变量复制到另一个变量并取消设置原始变量。这对于简单变量来说是微不足道的:

set TheNew $TheOld
unset TheOld

对于数组来说只是稍微复杂一点:

array set TheNew [array get TheOld]
unset TheOld

但是,这不会保留链接到数组中的变量或设置的任何跟踪。复制-删除与重命名不同。


将事物转化为过程稍微复杂一些,因为变量名称解析对其执行的上下文很敏感。因此,可能需要注意 upvaruplevel。我不会讨论这些选项;操作的核心是我上面所说的,但是它们是以上下文相关的方式完成的("#0" 是在引号中,因为这里语法高亮):

proc RenameGlobalVariable {OldName NewName} {
uplevel "#0" [list upvar 0 $OldName $NewName]
}
proc RenameGlobalSimpleVariable {OldName NewName} {
upvar "#0" $OldName old $NewName new
set new $old
unset old
}
proc RenameGlobalArray {OldName NewName} {
upvar "#0" OldName old $NewName new
array set new [array get old]
unset old
}

关于arrays - 重命名全局数组 TCL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40226851/

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