2010-08-11 85 views

回答

7
% set lista [list a b c] 
a b c 
% set listb {a b c} 
a b c 
% set b {1 2 3} 
1 2 3 
% set lista [list a $b c] 
a {1 2 3} c 
% set listb {a $b c} 
a $b c 

当您使用文字构建列表时,两种形式是等效的。当您使用变量,则[list ...]形式将扩大其放置在字符串中前变量和{...}形式不会。

本质上,{...}将其内部的任何内容视为单个连续字符串;特殊字符$从不解释。 [list ...]语句接受其参数并将它们连接在一起,并用空格分隔。因此,如果您正在使用的项目是字符串文本且不包含任何需要解释的内容,则这两个表单是相同的。

+0

也许值得比较'set list c'a $ b c''以及 – 2010-08-12 10:29:30

5

对于文字,它们在所有功能方面都是相同的(当然,除了直接文字形式稍快之外)。对于非文字,他们显然做了不同的事情(如bta所说)。

然而,还有比这更给它。让我们更深入地探索!

有,你做想用{…}"…"形式的情况下,而这恰恰与某些非文字工作时。特别是,如果你正在使用tcomTcl/Java(即Jacl的或TclBlend),那么你将与不正确遵守Tcl的语义对象进行工作。特别是,你会有一些“脆弱”的对象附加到一些值;如果包含该参考值Tcl_Obj了它的类型改变(“闪闪发光”,在Tcl的说法),那么参照下面的COM或Java对象将被无可挽回地下降,你用它完成之前,垃圾收集器会删除对象。使用[list …]形式建立名单(和列表操作,如lindex检索)将确保这些脆弱的内部表示正确地保持,直到你不再需要他们。

对于正常的Tcl值(包括大多数扩展包产生的值),除了注意使用非有损操作也更快之外,您无需担心这一点。如果你希望你的代码很快(谁不?),那么[list]是你的朋友,即使它没有必要(通常​​是这样)。

您要注意的另一种情况是产生回调时。

通常情况下,您希望执行回调,其中某些值在创建回调时已知,并且不会以其他方式存储在执行回调时存在的某个变量中。 (我用after,fileeventtrace做了很多工作,但有批次)。使用list(或其他列表生成命令)创建的回调脚本比所有其他替代方案快因为Tcl脚本评估引擎可以证明它们没有替换,并直接将列表元素送入命令调度程序。当你只是将值传递给一个过程时,这是一个优势,这被认为是回调的良好实践。

+0

还有JTcl,它是Jacl的继任者。虽然不值得编辑帖子来添加它。 – 2011-08-03 20:18:02

相关问题