如何将字符串传递给tcl中的函数?
我有这样一个函数:如何将字符串传递给tcl中的函数?,tcl,proc,Tcl,Proc,我有这样一个函数: proc test { {isSet "false"} } { if {isSet == "true"} { # do something } } 但是当我调用这个过程时,如何传递false或true: test "false" or test false? 您做错了(忽略您在if条件表达式中使用裸词isSet的事实,该表达式不起作用)。取而代之的是 proc test {{isSet "false"}} { if {$isSet} {
proc test { {isSet "false"} } {
if {isSet == "true"} {
# do something
}
}
但是当我调用这个过程时,如何传递false
或true
:
test "false" or test false?
您做错了(忽略您在if
条件表达式中使用裸词isSet
的事实,该表达式不起作用)。取而代之的是
proc test {{isSet "false"}} {
if {$isSet} {
# do something
}
}
这将允许您按自己的意愿调用测试程序:
test 0
test 1
test [expr {1 == 0}]
test yes
test false
test "no"
test {true}
test "off"
等等
其基本思想是Tcl解释器将尝试将isSet
变量中包含的值解释为布尔类型的值;这有一套规则:
- 整数类型的值0为false
- 与整数类型的0不同的值为true
- 其他所有内容首先转换为字符串,然后
- 一个字符串,字面上等于
yes
,true
或on
中的一个为true李>
- 字面上等于
no
、false
或off
之一的字符串为false
中描述了用于将字符串解释为布尔值的规则
您在假设中犯了另一个错误:Tcl没有显式的字符串和布尔类型(因为它是无类型的),因此“false”
和false
对于Tcl解释器在解析脚本时是完全一样的,因为在Tcl中使用双引号和大括号进行分组,不用于指定文字类型(并且Tcl没有文字)。因此,我建议从一开始就更好地掌握这些想法
我在描述将值解释为布尔值时提到的类型是Tcl值的内部类型,用户不可见-是的,Tcl在内部缓存值的“本机”表示,因此当您执行设置x[expr{1+2}]
时,在内部,分配给x
的值将具有整数类型,但这实际上是一个实现细节。您做错了(忽略您在if
条件表达式中使用裸字isSet
这一事实,该表达式不起作用)。取而代之的是
proc test {{isSet "false"}} {
if {$isSet} {
# do something
}
}
这将允许您按自己的意愿调用测试程序:
test 0
test 1
test [expr {1 == 0}]
test yes
test false
test "no"
test {true}
test "off"
等等
其基本思想是Tcl解释器将尝试将isSet
变量中包含的值解释为布尔类型的值;这有一套规则:
- 整数类型的值0为false
- 与整数类型的0不同的值为true
- 其他所有内容首先转换为字符串,然后
- 一个字符串,字面上等于
yes
,true
或on
中的一个为true李>
- 字面上等于
no
、false
或off
之一的字符串为false
中描述了用于将字符串解释为布尔值的规则
您在假设中犯了另一个错误:Tcl没有显式的字符串和布尔类型(因为它是无类型的),因此“false”
和false
对于Tcl解释器在解析脚本时是完全一样的,因为在Tcl中使用双引号和大括号进行分组,不用于指定文字类型(并且Tcl没有文字)。因此,我建议从一开始就更好地掌握这些想法
我在描述将值解释为布尔值时提到的类型是Tcl值的内部类型,用户不可见-是的,Tcl在内部缓存值的“本机”表示,因此当您执行设置x[expr{1+2}]
时,在内部,分配给x
的值将具有整数类型,但这实际上是一个实现细节。两者都可以,但测试“false”更正确。两者都可以,但测试“false”更正确。+1另一种可能是使用字符串为布尔值,字符串在某些组合中为true
而字符串为false
。我要指出的是,它们只有在解析用户值时才真正有用(其中“you betcha!
”是输入的一种明显的可能性),而不是来自程序的值。+1另一种可能性是在某种组合中使用string is boolean
,string is true
和string is false
。我要指出的是,它们只有在解析用户值时才真正有用(其中“youbetcha!
”是输入的明显可能性),而不是来自程序的值。