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