使用一个列表作为多变量,例如格式参数
Use one list as multi variable, such as format argument
在 Tcl 中
set f "%-3s %-3s %-3s"
set t {"aaa" "bbb" "ccc"}
puts [format $f $t]
我知道不对,会return错误:
not enough argument
那么如何纠正呢?
您可以使用 list expansion(从 Tcl 8.5 开始):
set f "%-3s %-3s %-3s"
set t {"aaa" "bbb" "ccc"}
puts [format $f {*}$t]
在以前的版本中,您必须使用 eval,不推荐
puts [eval format $f $t]
由于format
的说明符和参数的数量是固定的,为什么不用lassign
:
% lassign $t v1 v2 v3
% puts [format $f $v1 $v2 $v3]
aaa bbb ccc
一般来说,扩展运算符 {*}
是有目的的,因为说明符的数量,因此,参数是有些动态的。但在静态情况下,当使用 lassign
时,您最终会得到一个更健壮的脚本。在 t
中设想您的列表大小不同,而 format
需要正好三个值参数?
在 Tcl 中
set f "%-3s %-3s %-3s"
set t {"aaa" "bbb" "ccc"}
puts [format $f $t]
我知道不对,会return错误:
not enough argument
那么如何纠正呢?
您可以使用 list expansion(从 Tcl 8.5 开始):
set f "%-3s %-3s %-3s"
set t {"aaa" "bbb" "ccc"}
puts [format $f {*}$t]
在以前的版本中,您必须使用 eval,不推荐
puts [eval format $f $t]
由于format
的说明符和参数的数量是固定的,为什么不用lassign
:
% lassign $t v1 v2 v3
% puts [format $f $v1 $v2 $v3]
aaa bbb ccc
一般来说,扩展运算符 {*}
是有目的的,因为说明符的数量,因此,参数是有些动态的。但在静态情况下,当使用 lassign
时,您最终会得到一个更健壮的脚本。在 t
中设想您的列表大小不同,而 format
需要正好三个值参数?