【问题标题】:TCL multiple assignment (as in Perl or Ruby)TCL 多重赋值(如在 Perl 或 Ruby 中)
【发布时间】:2015-06-26 11:19:28
【问题描述】:

在 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 }

但我希望有一些更短/更少大括号的东西。

【问题讨论】:

    标签: variables tcl variable-assignment


    【解决方案1】:

    从 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
    

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

    文档:breakforeachlassignlistprocuplevel

    【讨论】:

    • 变量的顺序是因为这是旧的 TclX 扩展在其 lassign 实现中所做的。
    猜你喜欢
    • 2017-02-19
    • 2022-06-14
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多