我在期待
if {[some_func $some_args]} {
....
}
to eval true,只要some_func
返回一些字符串就可以正常工作。但是有错误。
艰难地学习,Tcl只接受
确切地说:
% expr 1
1
% expr 0
0
% expr
wrong # args: should be "expr arg ?arg ...?"
% expr {{}}
% expr true
true
% expr false
false
% expr True
syntax error in expression "True": variable references require preceding $
% expr False
syntax error in expression "False": variable references require preceding $
似乎expr
没有规范化它的返回值。请注意,如果给出空字符串,则为空字符串结果。
那么如何轻松地将字符串转换为布尔值?
答案 0 :(得分:3)
经过多思考,再看一些,答案可能应该是:“这取决于”
凭借我的perl背景,我期待类似于perl的东西。我的错。
在Tcl中string is true
似乎是官方的演员函数。用于投射的有效字符串为defined here:
如果string是0,false,no或off中的任何一个,则Tcl_GetBoolean存储a 零值在* boolPtr。如果string是1,true,yes或on中的任何一个,那么 1存储在* boolPtr中。这些值中的任何一个都可以缩写,并且 大写拼写也是可以接受的
在我的情况下,我不关心字符串的内容,所以我可以
if {[string length [some_func $some_args]] > 0} {
...
}
另一种写这种方式的方法也更简单:
if {[some_func $some_args] != {}} {
...
}
答案 1 :(得分:1)
从用户的角度来看,Tcl没有能力或需要将值从一种类型“转换”为另一种类型。相反,一切都是一个字符串,你问“这个值可以解释为?”例如:
set value 1
string is boolean $value
> 1
string is integer $value
> 1
set value true
string is boolean $value
> 1
string is integer $value
> 0
还有一些[string is]
子命令检查特定值,但这主要是为了方便起见。例如:
string is true $value
# effectively equivalent to
expr {[string is boolean $value] && $value}
所以,正如所说的那样,如果我没记错的话,可以解释为真的字符串会随着时间的推移而变化。我的建议是始终使用“true”或“false”,因为Tcl的所有版本(我认为)都将它们识别为布尔值,并且它们准确地表示它是boolean的意图(我不认为1/0这样做)。
如果您真正想要做的是查明您是否有包含实际内容的字符串,那么只需使用:
if {[string length $value] > 0} { ....}
如果您要做的是模仿其他语言的真实性版本,那么我的建议是不要那样做。当然,你可以通过
if { (![string is false $value]) && [string length $value] > 0 } { ... }
但这可能不是正确的方法。