Groovy GStringImpl和String行为

rcg*_*e23 15 string groovy equality

我最近一直在阅读在使用Groovy中的集合时GStringImpls vs Strings 的行为.

我理解这个评价错误的原因......

"${'test'}".equals("test") == false

是由于.equals()合同的对称性要求,但我想知道是否有一个原因GStringImpl不能String立即评估.所以,当我做这样的事情......

"${'someString'}"

我没有得到GStringImpl,我只是得到一个简单的Java String,我可以立即将其用作地图中的关键字,例如.

我知道有一些解决方法,比如

String s = "${'someString'}"

然而,像这样的东西是有点不方便,之间的混淆GStringImplString似乎是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类中的方法一样.