使用以下方法在TCL中创建列表之间存在哪些差异:
[list a b c]
VS
{a b c}
我绝不是一位经验丰富的TCL程序员,但到目前为止我遇到的唯一区别是当第一种风格需要使用行连续字符创建多行代码时:
[list \
a \
b \
c \
]
这解析得很好:
{
a
b
c
}
还有其他差异吗?这被认为是更好的风格或惯用语?
在使用嵌套列表创建复杂列表时,第二种样式似乎是唯一干净的方法。
答案 0 :(得分:5)
主要区别在于使用list
命令可以在定义列表时使用变量。注意这两者之间的区别:
% set foo 1
1
% set bar 2
2
% set list1 [list $foo $bar]
1 2
% set list2 {$foo $bar}
$foo $bar
请注意,如果需要,您还可以使用双引号:
% set list3 "$foo $bar"
1 2
重要的是要注意在使用变量构建列表的两种方法中,只保证使用list
可以为您提供正确的列表。使用引号可能会也可能不会为您提供列表,具体取决于变量的内容。这不是因为Tcl是神秘的或随机的或有问题的 - 它只是tcl引用的工作方式。使用list
,你要求tcl构造一个包含特定元素的列表,在其他人中你要创建一个看起来像列表的字符串,但它是否可以像列表一样对待取决于列表中的数据字符串。
以下是使用引号不会为您提供列表的示例:
% set foo "{"
{
% set list4 "$foo $bar"
{ 2
% lindex $list4 0
unmatched open brace in list
...而使用列表会给你一个正确的列表:
% set list5 [list $foo $bar]
\{ 2
% lindex $list5 0
{
重要的是要知道只有当tcl将列表转换为字符串以便打印列表时才会出现反斜杠 - 反斜杠不在数据中,正如您在使用lindex
时所看到的那样获取值。
答案 1 :(得分:3)
还有其他差异吗?这被认为是更好的风格或惯用语?
如果你在一个只包含文字的列表之后,没有变量或命令扩展或类似的东西,使用[list a b c]
和{a b c}
完全相同。它们在Tcl 8.6中编译为相同的字节码(将文字推送到结果堆栈)。确实没有任何区别。
哪个更惯用?说实话,我真的不知道。它们都惯用,并受个人偏好的影响。一旦开始使用变量和命令扩展,它们之间的区别就变得很重要,然后问题很快就不再相关了。
那就是说,我更喜欢使用{a b c}
。当文字较长时,它会更方便,因为我可以在多行中分解事物,而不会使用反斜杠延续。其他人不同意我的意见;对于他们来说,[list
... ]
的输入强烈提醒他们他们打算对数据做什么,这显然具有一些助记符值。