在groovy中:
println 'test' as Boolean //true
println 'test'.toBoolean() //false
println new Boolean('test') //false
有人可以澄清这种行为吗?
答案 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)
唐是对的:
的Groovy语言规则
'test' as Boolean
遵循coercion to a boolean
也被称为“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)。
跟踪一些错误以检查非空整数