我尝试在TCL中执行以下操作并出现以下错误 “list必须是偶数个元素”,因为$ args在传递给B时被视为一个列表。
是否有一种巧妙的方式将$ args传递给B?
proc A {a args} {
#call B and pass it args
B 2 $args
}
proc B {b args} {
set options(-flag1) 0
set options(-option) serial
array set options $args
#use options
}
答案 0 :(得分:3)
试试这个:
B 2 {*}$args
如果我们简化程序:
proc A args {
puts [info level 0]
B $args
}
proc B args {
puts [info level 0]
}
如果我们使用某些值调用A
,B
将会收到打包在列表中的值。此列表是args
中的单个项目,不适合传递给array set
,因为该命令需要一个偶数大小的列表。
% A a b c d
A a b c d
B {a b c d}
将B
的调用更改为:
proc A args {
puts [info level 0]
B {*}$args
}
现在,如果我们调用A
,A
的每个参数都将成为B
的独特参数,$args
现在可以用作array set
的参数1}}。
% A a b c d
A a b c d
B a b c d
正如nurdglaw所指出的,Tcl 8.4或更早版本没有{*}
语法,这意味着必须使用eval
来调用B
。一种方法是
eval [linsert $args 0 B]
但也可以使用稍微不那么安全的(它可能会导致参数结构丢失)
eval B $args
不再支持Tcl 8.4,并且有充分的理由升级到8.5或8.6。