I have a function like this:
proc test { {isSet "false"} } {
if {isSet == "true"} {
# do something
}
}
but when I call this proc, how to pass false
or true
:
test "false" or test false?
你做错了(忽略你在条件表达式中使用裸词的事实,这是isSet
行不通if
的)。而是做
proc test {{isSet "false"}} {
if {$isSet} {
# do something
}
}
这将允许您根据需要调用test
proc:
test 0
test 1
test [expr {1 == 0}]
test yes
test false
test "no"
test {true}
test "off"
ETC…
基本思想是 Tcl 解释器将尝试将变量中包含的值解释isSet
为布尔类型的值;有一套规则可以做到这一点:
yes
,true
或on
为真之一;no
, false
or之一off
是假的。用于将字符串解释为布尔值的规则在Tcl_GetBoolean()
手册中进行了描述。
而且您在假设中犯了另一个错误:Tcl 没有明确的字符串和布尔类型(因为它是无类型的),因此在 Tcl 解释器将您的脚本解析为双引号和花括号时,它"false"
与它们完全相同false
在 Tcl中用于分组,而不是用于指定文字类型(并且 Tcl 没有文字)。所以我建议从教程开始,以更好地掌握这些想法。
我在描述将值解释为布尔值时提到的类型是 Tcl 值的内部类型,并且不是用户可见的——是的,Tcl 在内部缓存值的“本机”表示,所以当你这样做时set x [expr {1 + 2}]
,在内部分配给的值x
将具有整数类型但这实际上是一个实现细节。