rcg*_*e23 15 string groovy equality
我最近一直在阅读在使用Groovy中的集合时GStringImpls vs Strings 的行为.
我理解这个评价错误的原因......
"${'test'}".equals("test") == false
是由于.equals()合同的对称性要求,但我想知道是否有一个原因GStringImpl不能String立即评估.所以,当我做这样的事情......
"${'someString'}"
我没有得到GStringImpl,我只是得到一个简单的Java String,我可以立即将其用作地图中的关键字,例如.
我知道有一些解决方法,比如
String s = "${'someString'}"
然而,像这样的东西是有点不方便,之间的混淆GStringImpl和String似乎是Groovy的新手大的"疑难杂症".
jal*_*aba 21
由于某些原因,GStrings不会立即对String进行评估,主要与延迟评估(对于日志记录非常有用)和模板有关.在Strings和GString中你可以找到一个很好的解释:
GString可能涉及延迟评估,所以直到调用toString()方法,才会评估GString.这种懒惰的评估对于日志记录这样的事情很有用,因为它允许计算字符串,对值的toString()调用,以及如果有的话,懒惰地完成不同字符串的连接.当你不想使用模板引擎,或者你真的想要对GStrings进行完全懒惰的评估时,GString非常方便.当嵌入在GString中的某个变量时,在该变量上调用toString()以获取字符串表示,并将其插入到最终字符串中.
因此:
GString和String是两个不同的类,因此使用GString对象作为Map对象的键或涉及GString对象的比较,当与String对象结合使用时会产生意外的结果,因为GString和String将不具有相同的hashCode,也不会等于.对于比较或映射键,两种类型之间没有自动强制,因此有时需要在GString对象上显式调用toString().
当代码期望GString时,意外转换为String可能会导致问题,就像groovy.sql类中的方法一样.