0

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?
4

1 回答 1

3

你做错了(忽略你在条件表达式中使用裸词的事实,这是isSet行不通if的)。而是做

proc test {{isSet "false"}} {
   if {$isSet} {
       # do something
   }
}

这将允许您根据需要调用testproc:

test 0
test 1
test [expr {1 == 0}]
test yes
test false
test "no"
test {true}
test "off"

ETC…

基本思想是 Tcl 解释器将尝试将变量中包含的值解释isSet为布尔类型的值;有一套规则可以做到这一点:

  • 整数类型的值 0 为假。
  • 整数类型的不同于 0 的值是 true。
  • 其他所有内容首先转换为字符串,然后
    • 一个字符串字面上等于yes,trueon为真之一;
    • 一个字符串字面上等于no, falseor之一off是假的。

用于将字符串解释为布尔值的规则在Tcl_GetBoolean()手册中进行了描述。

而且您在假设中犯了另一个错误:Tcl 没有明确的字符串和布尔类型(因为它是无类型的),因此在 Tcl 解释器将您的脚本解析为双引号和花括号时,它"false"与它们完全相同false在 Tcl中用于分组,而不是用于指定文字类型(并且 Tcl 没有文字)。所以我建议从教程开始,以更好地掌握这些想法。

我在描述将值解释为布尔值时提到的类型是 Tcl 值的内部类型,并且不是用户可见的——是的,Tcl 在内部缓存值的“本机”表示,所以当你这样做时set x [expr {1 + 2}],在内部分配给的值x将具有整数类型但这实际上是一个实现细节。

于 2013-07-29T16:22:23.657 回答