我想做类似python的操作:
set var [list 1 2 3]
set {x y z} $var
puts "$x $y $z"
其中var中的第一个元素分配给x,依此类推。
上面的方法不起作用,因为它创建了一个名为x y z
的变量。
有办法做到这一点吗?我的实际情况是我想从函数返回多个值并将每个值分配给另一个变量。在最坏的情况下,我可以返回一个带有可识别名称的字典,但更喜欢这种方法。
答案 0 :(得分:4)
如果您收到包含所需结果的列表,则可以执行以下操作:
proc someFunction {} {
return [list valA valB valC]
}
lassign [someFunction] x y z
puts "First: $x, second: $y, third $z"
# => First: valA, second: valB, third: valC
lassign
适用于Tcl 8.5及更高版本。
在您的特定示例中:
set var [list 1 2 3]
lassign $var x y z
puts "$x $y $z"
答案 1 :(得分:2)
如果您更喜欢类似Python的语法,那么创建一个允许它的命令非常容易:
proc mset {names values} {
uplevel 1 lassign [list $values] $names
}
用法:
set var [list 1 2 3]
mset {x y z} $var
puts "$x $y $z"
mset
( multiset )命令将一个名称列表和一个值列表作为参数(最好具有相同的长度,但它也可以处理不同长度的列表) 。它评估调用者堆栈级别中的lassign
命令。 uplevel
命令将调用lassign
的单词连接在一起,就像调用了concat
一样,这意味着调用lassign {1 2 3} {x y z}
将被评估为{{1} }}。通过在第一个参数(lassign 1 2 3 x y z
)周围添加一个嵌套列表,我们得到了调用lassign {{1 2 3}} {x y z}
。