3

想听取 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 ]

推荐哪种做法?

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

4

3 回答 3

7

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

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]

这样,您最终会得到ain $firstValuebinsecondValuec d ein $remainderList

于 2011-06-24T08:32:08.393 回答
3

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

鉴于此,不同之处在于传递参数的方式——通过引用或通过值——以及每个操作所需的内存预算。

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

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

于 2011-06-24T08:25:50.743 回答
0

相当于以下内容的语法是什么:

set lst [returnList]

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

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

return [$list1 $list2]

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

($var1, $var2) = process_that_returns_two_values;

但我不认为“set”在 Tcl 中允许这样做。

于 2014-03-04T20:24:59.410 回答