我有一个类似于:
的循环foreach x {a b} {
set type_$x [some_function_here]
set N_$x [function type_$x]
}
问题是我想在第二行中取消引用type_ $ a并将其值用作函数参数。
但是在做:
set N_$x [function $type_$x]
不起作用,我用subst命令尝试过的任何其他组合都没有。
我该如何解决这个问题?
答案 0 :(得分:3)
三种可能性,按照我认为你应该多喜欢它们的顺序。
到目前为止,最简单的技术是使用数组:
foreach x {a b} {
set type($x) [some_function_here]
set N($x) [function $type($x)]
}
这确实改变了你的程序的其他部分看到的东西,所以它不是零影响技术,但它很容易;我认为这是最常推荐的做法。
或者,使用upvar 0
为变量命名变量创建一个本地别名:
foreach x {a b} {
upvar 0 type_$x typex N_$x Nx
set typex [some_function_here]
set Nx [function $typex]
}
在内部,名称只解析为同一个存储单元,因此这是一种有效的技术(尽管upvar 0
非常棘手!)
set
最后,您可以使用带有一个参数的set
命令从任意命名的变量中读取; $
语法可以说只是语法糖。
foreach x {a b} {
set type_$x [some_function_here]
set N_$x [function [set type_$x]]
}
如果你经常这样做,它通常是一种代码味道,它通常表明你应该使用数组。
答案 1 :(得分:1)
set N_$x [function [set type_$x]]
$var
表示法基本上是命令[set var]
的简写,有时您需要使用命令而不是速记。
没有办法告诉命令评估“当我说'$ type_ $ x'时,我希望你保持评估第一个$
,直到整个变量名被放在一起”。也就是说,除非您将其写为[set type_$x]
,否则首先构建名称type_a
或type_b
,然后传递给set
。
答案 2 :(得分:0)
其他一些方法可以使用动态名称来修改变量。
% set x a
a
% set type_$a stackoverflow
stackoverflow
% expr \$type_$a
stackoverflow
% subst $[subst type_$a]
这有点复杂,但与其他方法相比。