【问题标题】:Groovy GStringImpl and String behaviourGroovy GStringImpl 和字符串行为
【发布时间】:2013-09-24 07:29:00
【问题描述】:

我最近一直在阅读有关 GStringImpls 与 Strings 在 Groovy 中的集合中使用时的行为。

我知道这评估为假的原因......

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

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

"${'someString'}"

我没有得到GStringImpl,我只是得到一个普通的Java String,例如,我可以立即将其用作地图中的键。

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

String s = "${'someString'}"

但是这样的事情有点不方便,GStringImplString 之间的混淆对于 Groovy 新手来说似乎是一个很大的“陷阱”。

【问题讨论】:

    标签: string groovy equality


    【解决方案1】:

    GStrings 由于某些原因,没有立即对 String 进行评估,主要与惰性评估(这对记录日志非常有用)和模板有关。在Strings and GString你可以找到一个很好的解释:

    GString 可能涉及 惰性求值,所以直到 toString() 调用方法来评估 GString 。这种懒惰的评价 对于诸如日志记录之类的事情很有用,因为它允许计算 字符串、对值的 toString() 调用以及连接 如果有的话,要懒惰地完成不同的字符串。

    当您不想使用模板引擎时,GString 非常方便, 或者当你真的想要对 GStrings 进行完全惰性求值时。当一些 嵌入在 GString 中的变量,在该变量上调用 toString() 变量以获取字符串表示形式,并将其插入 最后一个字符串。

    因此:

    GString 和 String 是两个不同的类,因此使用 GString 对象作为 Map 对象的键或涉及 GString 的比较 对象,与 String 结合时会产生意想不到的结果 对象,因为 GString 和 String 不会有相同的 hashCode 或 他们会平等吗?两者之间没有自动强制 用于比较或映射键的类型,因此有时需要 在 GString 对象上显式调用 toString()。

    当代码被意外转换为字符串时可能会导致问题 期望 GString,与 groovy.sql 类中的方法一样。

    【讨论】:

    • 我们可以动态扩展 GStringImpl 类以在构造时自动调用 .toString() 吗?
    • 调用toString() 对于像Groovy 这样的紧凑语言来说非常冗长。 Groovy 的人真的应该为此添加一个速记。斜线字符串也会产生 GStrings,顺便说一句。
    猜你喜欢
    • 2013-05-13
    • 2012-03-29
    • 2021-05-13
    • 2011-09-13
    • 1970-01-01
    • 2011-04-18
    • 2016-01-25
    • 2015-01-03
    • 2016-04-25
    相关资源
    最近更新 更多