在groovy中:
println 'test' as Boolean //true println 'test'.toBoolean() //false println new Boolean('test') //false
有人能澄清这种行为吗?
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语言的强制规则,它允许您编写:
java.lang.Boolean
'test' as Boolean
if ('hello') { println 'this string is truthy' }
对于字符串,规则是如果它为空或null,则计算结果为false,否则为true。我同意这可能被认为有点不一致,但如果在与java.lang.Boolean的构造函数的一致性和实用程序之间做出选择,我认为他们选择后者是正确的。
f87krz0w2#
布尔构造函数接受你给它的字符串,并对该字符串运行toBoolean()方法。简单地说,任何它 * 不能解析 * 为有效布尔值的东西都被视为false。或者,换句话说,只有'true'才是true。
toBoolean()
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)检查非空整数。
mitkmikd4#
String.metaClass.asBoolean = { ((String) delegate).toBoolean() }
6条答案
按热度按时间whlutmcx1#
这两个
示例化一个
java.lang.Boolean
,使用一个带String参数的构造函数。根据javadocs,规则是:如果字符串参数不为空且等于字符串“true”(忽略大小写),则分配表示值true的布尔对象。否则,分配表示值false的布尔对象。
在上述两种情况下,String都不匹配'true'(不区分大小写),因此创建的布尔值为false。
相比之下,
'test' as Boolean
遵循Groovy语言的强制规则,它允许您编写:对于字符串,规则是如果它为空或null,则计算结果为false,否则为true。
我同意这可能被认为有点不一致,但如果在与
java.lang.Boolean
的构造函数的一致性和实用程序之间做出选择,我认为他们选择后者是正确的。f87krz0w2#
布尔构造函数接受你给它的字符串,并对该字符串运行
toBoolean()
方法。简单地说,任何它 * 不能解析 * 为有效布尔值的东西都被视为false。或者,换句话说,只有'true'才是true。zfycwa2u3#
但是,当应用于其他对象时,会出现不一致:
(Groovy 1.7.8版)
如果(i!= null)或(i!= 0),则必须在第二个语句中显式
一些错误可以追溯到使用if(i)检查非空整数。
mitkmikd4#