如何在Tcl中将字符串转换/转换为bool?

时间:2012-04-05 13:16:30

标签: string casting boolean tcl

我在期待

if {[some_func $some_args]} {
   ....
}

to eval true,只要some_func返回一些字符串就可以正常工作。但是有错误。

艰难地学习,Tcl只接受

  • 空字符串 - >假
  • 0 - >假
  • false - >假
  • true - >真
  • 1 - >真

确切地说:

% 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没有规范化它的返回值。请注意,如果给出空字符串,则为空字符串结果。

那么如何轻松地将字符串转换为布尔值?

2 个答案:

答案 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 } { ... }

但这可能不是正确的方法。