考虑这段代码a
是一个全局变量:
% set a 1
1
% # FirstCase
% if "$a==1" "
puts >>>>>>>>>>>>>>>>
"
>>>>>>>>>>>>>>>>
% # Second case
% if {$a==1} {
puts >>>>>>>>>>>>>>>>
}
>>>>>>>>>>>>>>>>
在我的第一个案例中,我使用if
发表了""
声明。因此,a
的替换将在此处完成。可以接受的。
在我的第二个案例中,我使用if
发表了{}
声明。如何在a
替换? {}
表示不替换,但仍然使用变量。在if
相关代码中,它是否查找变量a
的全局堆栈?
答案 0 :(得分:2)
if
命令与expr
一样,旨在明确替换给定的参数。使用""
分组是不可取的,因为它可能会导致双重替换。
与tcl中的其他命令一样,if
实际上是一个函数。它不会查看全局堆栈,而是计算调用者堆栈中的表达式。
事实上,如果使用uplevel,你可以编写自己的版本:
proc _if_ {expression script} {
# uplevel causes expr to be evaluated in the caller's stack:
set condition [uplevel 1 "expr {$expression}"]
if {$condition} {
uplevel 1 $script
}
}
答案 1 :(得分:0)
在你的第一种情况下:“$ a == 1”是一个字符串,而不是零值,这将使其成立:尝试 - >
% if "0" "
puts >>>>>>>>>>>>>>>>
"
它不会通过这个条件。你在这里很幸运,因为“$ a == 1”的值不为零,如果变为真,则传递给值。
在第二种情况下:
% if {$a==1} {
puts >>>>>>>>>>>>>>>>
}
$ a == 1 - >是一个条件本身。