我玩弄Tcl和發現幾種情況下[list a b c]
是{a b c}
互換。什麼是首選方法,[list a b c]
不能匹配{a b c}
的行爲?Tcl [list a b c] vs {a b c}有什麼區別,在什麼情況下?
回答
% 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 ...]
語句接受其參數並將它們連接在一起,並用空格分隔。因此,如果您正在使用的項目是字符串文本且不包含任何需要解釋的內容,則這兩個表單是相同的。
對於文字,它們在所有功能方面都是相同的(當然,除了直接文字形式稍快之外)。對於非文字,他們顯然做了不同的事情(如bta所說)。
然而,還有比這更給它。讓我們更深入地探索!
有,你做不想用{…}
或"…"
形式的情況下,而這恰恰與某些非文字工作時。特別是,如果你正在使用tcom或Tcl/Java(即Jacl的或TclBlend),那麼你將與不正確遵守Tcl的語義對象進行工作。特別是,你會有一些「脆弱」的對象附加到一些值;如果包含該參考值Tcl_Obj
了它的類型改變(「閃閃發光」,在Tcl的說法),那麼參照下面的COM或Java對象將被無可挽回地下降,你用它完成之前,垃圾收集器會刪除對象。使用[list …]
形式建立名單(和列表操作,如lindex
檢索)將確保這些脆弱的內部表示正確地保持,直到你不再需要他們。
對於正常的Tcl值(包括大多數擴展包產生的值),除了注意使用非有損操作也更快之外,您無需擔心這一點。如果你希望你的代碼很快(誰不?),那麼[list]
是你的朋友,即使它沒有必要(通常是這樣)。
您要注意的另一種情況是產生回調時。
通常情況下,您希望執行回調,其中某些值在創建回調時已知,並且不會以其他方式存儲在執行回調時存在的某個變量中。 (我用after
,fileevent
和trace
做了很多工作,但有批次)。使用list
(或其他列表生成命令)創建的回調腳本比所有其他替代方案快因爲Tcl腳本評估引擎可以證明它們沒有替換,並直接將列表元素送入命令調度程序。當你只是將值傳遞給一個過程時,這是一個優勢,這被認爲是回調的良好實踐。
還有JTcl,它是Jacl的繼任者。雖然不值得編輯帖子來添加它。 – 2011-08-03 20:18:02
- 1. A == B對B == A,有什麼區別
- 2. a + = b和a = + b之間的區別是什麼,a ++和++ a?
- 3. flash(a,b)和flash()。put(a,b)在PlayFramework中有什麼區別?
- 4. 在git中,A..B和A ... B有什麼區別?
- 5. 爲什麼var c =「a」|| 「b」返回c =「a」和var c =「a」&&「b」返回c =「b」?
- 6. 有什麼區別myObj.a = b vs myObj [a] = b
- 7. a = a + b和a + = b之間的區別是什麼?
- 8. a // b和int(a/b)之間有什麼區別?
- 9. Ruby中的object.method(a,b)和方法(a,b)有什麼區別
- 10. MatLab中的[A,B]和[A; B]有什麼區別?
- 11. array.sort()和array.sort(function(a,b){return a - b;})有什麼區別?
- 12. swap(int&a,int&b)和swap(int * a,int * b)。有什麼區別?
- 13. a,b = b,a + b和a = b,b = a + b在fibonacci中的區別是什麼[Python]
- 14. a [:] = b和a = b之間的區別是什麼?
- 15. 紅寶石。爲什麼arr =%w {'a','b','c'} => [「'a',」,「'b',」,「'c'」]
- 16. 「a,b,c」.split(「,」)優於[「a」,「b」,「c」]的優點是什麼?
- 17. * a = b和a =&b之間的區別是什麼?
- 18. a = b = c和編程分別賦值有什麼區別?
- 19. 從{a-b,b-c,c-a}改變爲{(a,b),(b,c),(c,a)}?
- 20. 爲什麼caddr [(A B C)] = C?
- 21. 爲什麼有A = A +之間的差異B和A + = B
- 22. 什麼是A&B代表.Aggregate((a,b)=>聲明w/a&b)
- 23. A a有什麼區別?和A a();?
- 24. * a = * b在C中表示什麼?
- 25. 爲什麼a.compareTo(b)等於compareTo(a,b)或a.method(b)= method(a,b)?
- 26. '(a b c)和(list'a'b'c)之間的區別是什麼?
- 27. double a = a + int b和int a + = double b之間的區別是什麼?
- 28. 簡化布爾表達式(a *'b *'c)+('a *'b * c)+('a * b *'c)+(a *'b * c)
- 29. 'b'和'c'有什麼區別?
- 30. d.update(dict(a = 1,b = 2))和d.update(dict('a'= 1,'b'= 2)之間有什麼區別)
也許值得比較'set list c'a $ b c''以及 – 2010-08-12 10:29:30