use*_*991 1 variables tcl variable-assignment
在Ruby或Perl中,可以使用括号分配多个变量.例如(在Ruby中):
(i,j) = [1,2]
(k,m) = foo() #foo returns a two element array
Run Code Online (Sandbox Code Playgroud)
可以用优雅的方式在TCL中完成相同的工作吗?我的意思是我知道你可以这样做:
foreach varname { i j } val { 1 2 } { set $varname $val }
foreach varname { k m } val [ foo ] { set $varname $val }
Run Code Online (Sandbox Code Playgroud)
但我希望有更短的东西/更少的支撑.
从Tcl 8.5起,你就可以做到
lassign {1 2} i j
lassign [foo] k m
Run Code Online (Sandbox Code Playgroud)
注意值源的有些不直观的从左到右的顺序 - >变量.它不是一个独特的设计选择:例如scan并regexp使用相同的约定.我是那些发现它的可读性稍差的人之一,但是一旦人们习惯了它,它就不是一个真正的问题.
如果真的需要类似Ruby的语法,可以很容易地安排它:
proc mset {vars vals} {
uplevel 1 [list lassign $vals {*}$vars]
}
mset {i j} {1 2}
mset {k m} [foo]
Run Code Online (Sandbox Code Playgroud)
在Tcl 8.5之前你可以使用
foreach { i j } { 1 2 } break
foreach { k m } [ foo ] break
Run Code Online (Sandbox Code Playgroud)
至少比你的例子中的括号少.
文档:break,foreach,lassign,list,proc,uplevel