使用以下方法在TCL中创建列表之间存在以下差异:
[list a b c]
Run Code Online (Sandbox Code Playgroud)
VS
{a b c}
Run Code Online (Sandbox Code Playgroud)
我绝不是一个经验丰富的TCL程序员,但到目前为止我遇到的唯一区别是当创建多行的列表时,第一种样式需要使用行继续符,如:
[list \
a \
b \
c \
]
Run Code Online (Sandbox Code Playgroud)
这解析得很好:
{
a
b
c
}
Run Code Online (Sandbox Code Playgroud)
还有其他差异吗?哪个被认为是更好的风格或惯用?
看来,在创建具有嵌套列表的复杂列表时,第二种样式是唯一干净的方法.
主要区别在于使用该list命令可以在定义列表时使用变量.注意这两者之间的区别:
% set foo 1
1
% set bar 2
2
% set list1 [list $foo $bar]
1 2
% set list2 {$foo $bar}
$foo $bar
Run Code Online (Sandbox Code Playgroud)
请注意,如果需要,您还可以使用双引号:
% set list3 "$foo $bar"
1 2
Run Code Online (Sandbox Code Playgroud)
重要的是要注意在使用变量构建列表的两种方法中,只有使用才能list保证为您提供正确的列表.使用引号可能会也可能不会为您提供列表,具体取决于变量的内容.这不是因为Tcl是神秘的或随机的或有问题的 - 它只是tcl引用的工作方式.随着list你问TCL构建具有特定元素的列表,在别人对你正在创建一个字符串,它看起来像一个名单,但是否能像对待一个列表或不依赖于字符串中的数据.
这是一个使用引号不会给你一个列表的例子:
% set foo "{"
{
% set list4 "$foo $bar"
{ 2
% lindex $list4 0
unmatched open brace in list
Run Code Online (Sandbox Code Playgroud)
...而使用列表将为您提供一个正确的列表:
% set list5 [list $foo $bar]
\{ 2
% lindex $list5 0
{
Run Code Online (Sandbox Code Playgroud)
重要的是要知道只有当tcl将列表转换为字符串以便打印列表时才会出现反斜杠 - 反斜杠不在数据中,正如您在lindex用于获取值时所看到的那样.