Groovy真理:字符串到布尔值的不一致性?

Groovy真理:字符串到布尔值的不一致性?,groovy,Groovy,在groovy中: println 'test' as Boolean //true println 'test'.toBoolean() //false println new Boolean('test') //false 有人能澄清这一行为吗?布尔构造函数将获取您提供的字符串,并对该字符串运行toBoolean()方法。简而言之,任何不能解析为有效布尔值的内容都将被视为false。或者,换句话说,只有“真”才是真的。我倾向于同意@cdeszaq关于构造函数的观点,就你的第一个例子而言,我

在groovy中:

println 'test' as Boolean //true
println 'test'.toBoolean() //false
println new Boolean('test') //false

有人能澄清这一行为吗?

布尔构造函数将获取您提供的字符串,并对该字符串运行
toBoolean()
方法。简而言之,任何不能解析为有效布尔值的内容都将被视为false。或者,换句话说,只有“真”才是真的。

我倾向于同意@cdeszaq关于构造函数的观点,就你的第一个例子而言,我会说它只是把它抛到了一边。只要指针不为null,它就会为true。我想象
.toBoolean()
实际上试图解析它的对象值。考虑执行<代码>“真”。toBooLoANE()/<代码>和<代码> '1'。toBooLoANE()/<代码>查看它们返回的内容。

在这个问题之前,我从未听说过Groovy,这可能都是错误的。

这两个问题

println 'test'.toBoolean() //false
println new Boolean('test') //false
使用接受单个字符串参数的构造函数实例化
java.lang.Boolean
。根据法律,规则是:

如果字符串参数不为null且等于字符串“true”(忽略大小写),则分配表示值true的布尔对象。否则,分配一个表示值false的布尔对象

在上述两种情况下,字符串与'true'不匹配(不区分大小写),因此创建的布尔值为false

相比之下,
作为布尔值的“test”遵循的是Groovy语言规则,它允许您编写:

if ('hello') {
    println 'this string is truthy'
}
,规则是,如果为空或null,则计算结果为false,否则为true

我同意这可能被认为有点不一致,但如果在与
java.lang.Boolean
的构造函数的一致性和实用性之间做出选择,我认为他们选择后者是正确的。

Don在以下方面是正确的:

作为布尔值的“test”遵循Groovy语言规则

这也被称为“Groovy truth”

但是groovy中的
String.toBoolean()
并不仅仅是用字符串作为参数构造布尔值。从:

String.toBoolean()
将给定字符串转换为布尔对象。如果修剪后的字符串为“true”、“y”或“1”(忽略大小写),则结果为true,否则为false

:


但是,当应用于其他对象时,会出现不一致:

int i = 0
String s = 'abc'

if (s)
    println 's is true' // will be printed

if (i) 
    println ' i "is true" ' // will not be printed
(Groovy 1.7.8)

在第二个if、if(i!=null)或if(i!=0)中必须显式


有些错误可以追溯到使用if(i)检查非空整数。

我想您的意思是在“这两个”'1'之前显示两个false​ 返回true。你可以在这里测试一下:这显然是不正确的,见@jaetzold的答案。
int i = 0
String s = 'abc'

if (s)
    println 's is true' // will be printed

if (i) 
    println ' i "is true" ' // will not be printed