Groovy Truth:字符串到布尔不一致?

时间:2012-01-19 17:15:10

标签: groovy

在groovy中:

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

有人可以澄清这种行为吗?

5 个答案:

答案 0 :(得分:32)

这两个

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

使用带有单个String参数的构造函数实例化java.lang.Boolean。根据{{​​3}},规则是:

  

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

在上述两种情况中,String都不匹配'true'(不区分大小写),因此创建的布尔值为false。

相比之下,'test' as Boolean遵循the javadocs的Groovy语言规则,允许您编写:

if ('hello') {
    println 'this string is truthy'
}

对于String,规则是如果它为空或null,则计算结果为false,否则为true。

我同意这可能被认为有点不一致,但考虑到与java.lang.Boolean的构造函数和实用程序的一致性之间的选择,我认为选择后者是正确的。

答案 1 :(得分:17)

唐是对的:

  

'test' as Boolean遵循coercion to a boolean

的Groovy语言规则

也被称为“Groovy真理”。

但是groovy中的String.toBoolean()不只是构造一个以String作为参数的布尔值。来自groovy api docs on String.toBoolean()

  

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

A few good examples for strings and their conversion with toBoolean()

assert "y".toBoolean()
assert 'TRUE'.toBoolean()
assert '  trUe  '.toBoolean()
assert " y".toBoolean()
assert "1".toBoolean()

assert ! 'other'.toBoolean()
assert ! '0'.toBoolean()
assert ! 'no'.toBoolean()
assert ! '  FalSe'.toBoolean()

答案 2 :(得分:0)

布尔构造函数正在获取您给它的字符串并在该字符串上运行toBoolean()方法。简而言之,无法解析作为有效布尔值的任何内容都被视为false。或者,换句话说,只有' true'是的。

答案 3 :(得分:0)

我倾向于同意@ cdeszaq关于构造函数的观点,并且就你的第一个例子而言,我会说它只是将它转换为bool。只要指针不为null,它就是真的。我想.toBoolean()实际上试图解析它的对象值。考虑执行'true'.toBoolean()'1'.toBoolean()以查看他们返回的内容。

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

答案 4 :(得分:0)

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

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)。

跟踪一些错误以检查非空整数