0

考虑这段代码 wherea是一个全局变量:

% set a 1
1
% # FirstCase 
% if "$a==1" "
       puts >>>>>>>>>>>>>>>>
"
>>>>>>>>>>>>>>>>
% # Second case
% if {$a==1} {
     puts >>>>>>>>>>>>>>>>
}
>>>>>>>>>>>>>>>>

在我的第一个案例中,我if"". a因此将在此处进行替换。可以接受。

在我的第二种情况下,我if{}. 这里的替换是如何a发生的?{}表示不替代,但使用了变量。在if相关代码中,它是否查找变量的全局堆栈a

4

2 回答 2

2

if命令,likeexpr旨在显式替换给它的参数。不建议使用""分组,因为它可能导致发生双重替换。

与 tcl 中的其他命令一样,if实际上是一个函数。它不查看全局堆栈,而是评估调用者堆栈中的表达式。

实际上,您可以编写自己的 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
    }
}
于 2013-09-06T04:36:44.703 回答
0

在您的第一种情况下:“$a==1”是一个字符串而不是零值,这将使它成为真的:Try->

% if "0" "
 puts >>>>>>>>>>>>>>>>
"

它不会通过条件。您在这里很幸运,因为 "$a==1" 的值不为零,并且传递给 if 的值变为 true。

在第二种情况下:

% if {$a==1} {
    puts >>>>>>>>>>>>>>>>
}

$a==1 -> 本身就是一个条件。

于 2013-09-06T06:34:02.537 回答