4

我期待

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

评估 true 并在some_func返回一些字符串后立即工作。但是也有错误。

艰难地学习它,Tcl 只接受

  • 空字符串-> False
  • 0 -> 假
  • 假 -> 假
  • 真->真
  • 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没有标准化它的返回值。如果给出空字符串,请特别注意空字符串结果。

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

4

2 回答 2

3

多想,多看几眼后,答案可能应该是:“视情况而定”

以我的 perl 背景,我期待类似于 perl 的东西。我的错。

在 Tclstring is true中似乎是官方的 cast 函数。用于强制转换的有效字符串在此处定义

如果 string 是 0、false、no 或 off 中的任何一个,则 Tcl_GetBoolean 将零值存储在 *boolPtr。如果 string 是 1、true、yes 或 on 中的任何一个,则 1 存储在 *boolPtr 中。这些值中的任何一个都可以缩写,也可以接受大写拼写

就我而言,我不关心字符串的内容,所以我可以

if {[string length [some_func $some_args]] > 0} {
  ...
}

另一种写法也更简单:

if {[some_func $some_args] != {}} {
  ...
}
于 2012-04-05T13:25:33.877 回答
2

从用户的角度来看,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(我认为)都将它们识别为布尔值,并且它们准确地表示了它是布尔值的意图(我认为 1/0 不会这样做)。

如果你真正想做的是找出你是否有一个包含实际内容的字符串,那么只需使用:

if {[string length $value] > 0} { ....}

如果你想要做的是模仿其他语言版本的真实性,那么我的建议是不要那样做。当然,你可以,通过

if { (![string is false $value]) && [string length $value] > 0 } { ... }

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

于 2012-04-05T17:22:00.927 回答