希望得到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 ]
建议采用哪种做法?
编辑:很抱歉,我无法理解回答此问题的人的共识(和解释)。答案 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
中$firstValue
,b
中secondValue
和c 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中使用。