我有以下代码:
proc list_backslash {} {
array unset options
array set options {
-inputs {vdd}
-outputs {vss}
}
set inputs { vdd2 vdd dvdd }
set outputs { vss2 vss dvss }
set updateOptions [ list \
-inputs $inputs \
-outputs $outputs ]
array set options $updateOptions
foreach {k v} [array get options] {
puts "$k => $v"
}
}
由于我在updateOptions
中有很多键值对,因此存在严重的反睫毛炎!是否有更好的方法来执行代码updateOptions
?我尝试了subst
+大括号{}
,并意识到它不会保留列表结构,从而实现它。
答案 0 :(得分:3)
一般来说,如果你需要继续一行,你必须使用Tcl的某种引用机制。否则,命令调用在行结束时结束。 [
括号]
也可以包含多个语句;这是合法的,但确实不推荐。
但这确实意味着有时你会有尴尬的选择。也许你最好这样做:
set updateOptions {
-inputs $inputs
-outputs $outputs
}
foreach {key value} $updateOptions {
set options($key) [subst $value]
}
array set
命令在代码进入过程中时,在获得大量选项(数千个)之前效率不高。
或者如果你有Tcl 8.6,dict map
可能更好:
array set options [dict map {key value} $updateOptions {subst $value}]
请注意subst
在Tcl 8.6中不是特别有效的命令,除非与文字参数一起使用。那是因为使用变量参数,它会在运行时将它们编译为字节码。
答案 1 :(得分:2)
选项a)将所有内容放在一行上。
选项b)将代码结构为:
set options(-inputs) $inputs
set options(-outputs) $outputs
选项c)学会喜欢反斜杠。