TCL - 返回变量vs upvar并修改

时间:2011-06-24 08:09:22

标签: tcl proc-object upvar

希望得到TCL专业人士的建议以获得最佳实践。

假设您要使用proc构建包含特定数据的列表。现在哪种方式最好?

proc processList { myList } {
   upvar $myList list_
    #append necessary data into list_
}

proc returnList {} {
    set list_ {} 
    #append necessary data into list_
    return $list_
}

set list1 {}
processList list1

set list2 [returnList ]

建议采用哪种做法?

编辑:很抱歉,我无法理解回答此问题的人的共识(和解释)。

3 个答案:

答案 0 :(得分:6)

我几乎总是使用第二种方法:

proc returnList {} {
    set result {}
    # ... accumulate the result like this ...
    lappend result a b c d e
    return $result
}
set lst [returnList]

内存使用率或速度几乎没有差异,但我发现在功能上思考更容易。此外,在Tcl 8.5中,您可以相对简单地分割结果列表(如果这是您需要的):

set remainderList [lassign [returnList] firstValue secondValue]

有了这个,你最终会在a$firstValuebsecondValuec d e$remainderList。< / p>

答案 1 :(得分:3)

第一个选项修改现有列表,第二个选项创建新列表。为了更好的比较,我将向returnList()添加一个参数,并从该参数创建一个返回值。

鉴于此,差异在于传递参数的方式 - 通过引用或按值 - 以及每个操作所需的内存预算。

第二种方法没有任何副作用,但如果列表很大,则可能会非常消耗。

没有一般规则推荐一个在另一个上面。我自己的规则是从第二种方式开始,除非其他限制导致不这样做。

答案 2 :(得分:0)

相当于:

的语法是什么?
set lst [returnList]

如果您想一次返回多个列表?

我想如果你做了这样的事情:

return [$list1 $list2]

它应该返回一个列表列表,然后您可以使用lindex访问它们。但是,这似乎并不完全是它的作用。它实际上只给你两个列表,没有外部花括号将它们分组到一个列表中。在Perl中,您可以执行以下操作:

($var1, $var2) = process_that_returns_two_values;

但我不认为“set”允许在Tcl中使用。