首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCL - return变量与upvar和modify

TCL - return变量与upvar和modify
EN

Stack Overflow用户
提问于 2011-06-24 16:09:22
回答 3查看 3.6K关注 0票数 3

愿意接受TCL专业人士的建议,以获得最佳实践。

假设您想使用proc构造一个包含特定数据的列表。现在,哪种方法是最好的?

代码语言:javascript
复制
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 ]

以下哪种做法是推荐的?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-24 16:32:08

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

代码语言:javascript
复制
proc returnList {} {
    set result {}
    # ... accumulate the result like this ...
    lappend result a b c d e
    return $result
}
set lst [returnList]

在内存使用或速度上几乎没有区别,但我发现从功能上考虑更容易一些。此外,在TCL8.5中,您可以相对简单地对结果列表进行拆分(如果这是您需要的):

代码语言:javascript
复制
set remainderList [lassign [returnList] firstValue secondValue]

这样,您就可以在$firstValue中使用a,在secondValue中使用b,在$remainderList中使用c d e

票数 7
EN

Stack Overflow用户

发布于 2011-06-24 16:25:51

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

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2014-03-05 04:24:59

等价物的语法是什么:

代码语言:javascript
复制
set lst [returnList]

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

我想如果你这样做的话:

代码语言:javascript
复制
return [$list1 $list2]

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

代码语言:javascript
复制
($var1, $var2) = process_that_returns_two_values;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6465033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档