TCL - 将多个变量设置为 0

TCL - set multiple variables to 0

我有很多计数变量(即:count1 count2 count3....)

set count1 0
set count2 0
set count3 0

在 TCL 中是否有更短的方法来设置所有 count1.....count100 0

而不是在单独的行中键入所有内容

即:设置 count1 [列表 ....]

如果你有这么多足够密切相关的变量,我建议改用数组,你可以用它来循环:

for {set i 0} {$i <= 100} {incr i} {
    set count($i) 0
}

这样,如果您不需要计数,您可以随时取消设置数组并轻松快速地释放一些内存。

如果由于某种原因你不能使用数组代替普通变量,那么你仍然可以这样做:

for {set i 0} {$i <= 100} {incr i} {
    set count$i 0
}

如果变量彼此之间没有太大关系并且变量也不多,您可以像这样使用 lassignlrepeat

lassign [lrepeat 4 0] a b c d

在上面,lrepeat 将创建一个包含元素 0 4 次的列表。

I have many counts variable (ie: count1 count2 count3....)

不要,只需维护一个 Tcl 列表并按列表位置访问各种计数:

set count [list 0 0 0 0]; # This is your "multi-set"

lindex $count 0; # a.k.a. $count0 or [set count0]
lset count 0 5; # a.k.a. [set count0 5]

lindex $count 1; # a.k.a. $count1
lset count 1 10; # a.k.a. [set count1 10]

如果您仍想 "explode" 将您的计数列表编码为一组专用变量,这是 Jerry 使用 lassign 的建议的通用变体,然后:

% set varNames [lmap idx [lsearch -all $count *] {string cat count $idx}]
count0 count1 count2 count3
% lassign $count {*}$varNames
% info vars count*
count count0 count1 count2 count3

set命令returns加载到变量中的值。因此,当仅将几个变量初始化为 0 时,您可以这样做:

set count1 [set count2 [set count3 0]]

但是有 100 个变量是不实用的。

如果您有 100 个计数器,使用数组几乎肯定会容易得多。 Counter 听起来你会在变量上使用 incr 命令来计算一些东西。自 Tcl 8.5 起,变量(包括数组元素)无需初始化为 0 即可使 incr 正常工作。您可以只使用 incr count($x) 而无需任何事先初始化。