2010-08-11 84 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

相關問題