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
请注意值源 -> 变量从左到右的顺序有些不直观。这不是一个独特的设计选择:例如scan
和 regexp
使用相同的约定。我是那些发现它的可读性稍差的人之一,但是一旦习惯了它就不是真正的问题。
如果真的需要类似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
至少比您的示例中的括号少。
在 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
请注意值源 -> 变量从左到右的顺序有些不直观。这不是一个独特的设计选择:例如scan
和 regexp
使用相同的约定。我是那些发现它的可读性稍差的人之一,但是一旦习惯了它就不是真正的问题。
如果真的需要类似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
至少比您的示例中的括号少。