Tcl 在条件中使用大括号
写不带大括号的条件是否安全?e、 g:Tcl 在条件中使用大括号,tcl,Tcl,写不带大括号的条件是否安全?e、 g: if [$step > 0] { # … } if {[$step > 0]} { # … } 还是我必须用牙套?e、 g: if [$step > 0] { # … } if {[$step > 0]} { # … } 与带大括号的行相比,不带大括号的行看起来可读。 但是有什么缺点/需要注意的地方吗?你需要牙套。此外,您不需要[][]将其内容作为命令进行评估,并将其自身替换为命令的返回值。那么你的第一个版本 if [$st
if [$step > 0] {
# …
}
if {[$step > 0]} {
# …
}
还是我必须用牙套?e、 g:
if [$step > 0] {
# …
}
if {[$step > 0]} {
# …
}
与带大括号的行相比,不带大括号的行看起来可读。但是有什么缺点/需要注意的地方吗?你需要牙套。此外,您不需要
[]
<代码>[]将其内容作为命令进行评估,并将其自身替换为命令的返回值。那么你的第一个版本
if [$step > 0] { }
假设$step
为3
,则相当于
if [3 > 0] { }
它试图将[3>0]
作为命令进行评估,并抱怨3
不是命令
第二个版本也有同样的问题,因为表达式计算任何嵌入的命令替换
你真正想要的只是
if {$step > 0} { ... }
需要记住的是,在Tcl中,控制结构的行为方式与用户定义的函数相同(事实上,通常可以使用Tcl代码实现)。
if
命令采用2-4个参数,形式为“if”条件,然后块[[“else”]else块]
。第一个参数始终是条件。第二个是then块。第三个是可选单词“else”,第四个是可选的else块(如果存在“else”单词,则需要else块)
由于此构造采用简单参数,因此需要确保为其提供参数。因此,条件参数需要用括号括起来,以确保它是一个单独的参数(同时也确保不会过早解释任何替换,因为条件的计算将为您解释它们)。类似地,then块和else块也用大括号括起来。如果[string match…]{…},这个答案对这种情况也有效吗?@Dor:简短的答案是“是的,您仍然应该使用大括号”。但这个案例有点不同。在您的问题中,您的条件是一个适合传递给
expr
的表达式(这就是if
所做的)。在本例中,表达式是返回0或1的命令替换。正确的做法仍然是使用大括号,因为if
将为您计算命令替换,但在技术上,在这种情况下,计算0
或1
并不重要,因为表达式返回相同的0
或1
。但我建议始终使用大括号以保持一致性使用大括号还可以防止“双重替换”——这意味着tcl解析器不必替换变量和命令,因为expr解析器无论如何都要这样做。