TCL 多重赋值(如 Perl 或 Ruby)

TCL multiple assignment (as in Perl or Ruby)

在 Ruby 或 Perl 中,可以使用括号为多个变量赋值。例如(在 Ruby 中):

(i,j) = [1,2]
(k,m) = foo() #foo returns a two element array

可以在 TCL 中以优雅的方式完成同样的事情吗?我的意思是我知道你可以 做:

foreach varname { i j } val { 1 2 } { set $varname $val }
foreach varname { k m } val [ foo ] { set $varname $val }

但我希望有更短/更少牙套的东西。

从 Tcl 8.5 开始,您可以

lassign {1 2} i j
lassign [foo] k m

请注意值源 -> 变量从左到右的顺序有些不直观。这不是一个独特的设计选择:例如scanregexp 使用相同的约定。我是那些发现它的可读性稍差的人之一,但是一旦习惯了它就不是真正的问题。

如果真的需要类似Ruby的语法,可以很容易地安排:

proc mset {vars vals} {
    uplevel 1 [list lassign $vals {*}$vars]
}

mset {i j} {1 2}
mset {k m} [foo]

在 Tcl 8.5 之前你可以使用

foreach { i j } { 1 2 } break
foreach { k m } [ foo ] break

至少比您的示例中的括号少。

文档:break, foreach, lassign, list, proc, uplevel