groovy 妙真理:字符串与布尔值不一致?

lnvxswe2  于 2022-11-01  发布在  其他
关注(0)|答案(6)|浏览(316)

在groovy中:

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

有人能澄清这种行为吗?

whlutmcx

whlutmcx1#

这两个

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

示例化一个java.lang.Boolean,使用一个带String参数的构造函数。根据javadocs,规则是:
如果字符串参数不为空且等于字符串“true”(忽略大小写),则分配表示值true的布尔对象。否则,分配表示值false的布尔对象。
在上述两种情况下,String都不匹配'true'(不区分大小写),因此创建的布尔值为false。
相比之下,'test' as Boolean遵循Groovy语言的强制规则,它允许您编写:

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

对于字符串,规则是如果它为空或null,则计算结果为false,否则为true。
我同意这可能被认为有点不一致,但如果在与java.lang.Boolean的构造函数的一致性和实用程序之间做出选择,我认为他们选择后者是正确的。

f87krz0w

f87krz0w2#

布尔构造函数接受你给它的字符串,并对该字符串运行toBoolean()方法。简单地说,任何它 * 不能解析 * 为有效布尔值的东西都被视为false。或者,换句话说,只有'true'才是true。

zfycwa2u

zfycwa2u3#

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

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版)
如果(i!= null)或(i!= 0),则必须在第二个语句中显式
一些错误可以追溯到使用if(i)检查非空整数。

mitkmikd

mitkmikd4#

String.metaClass.asBoolean = {
    ((String) delegate).toBoolean()
}

相关问题