gpt4 book ai didi

用于 CustomClass 和数字/字符串的 Groovy CompareTo

转载 作者:行者123 更新时间:2023-12-02 06:50:36 24 4
gpt4 key购买 nike

我正在构建 DSL 并尝试定义一个自定义类 CustomClass,您可以在诸如

之类的表达式中使用它
def result = customInstance >= 100 ? 'a' : 'b'
if (customInstance == 'hello') {...}

当您的类定义 equals 并实现 Comparable(定义 compareTo)时,Groovy 不会调用 ==同时。

相反,Groovy 调用具有分支逻辑的 compareToWithEqualityCheck。除非您的自定义 DSL 类可从 StringNumber 分配,否则您的自定义 compareTo 将不会在上面的示例中被调用。

您无法使用 String 扩展 CustomClass。我觉得我失去了一些东西。希望您能帮助我弄清楚如何实现一个像我上面所示的简单案例。

最佳答案

首先,这是一个简短的答案:您可以为 CustomClass 扩展 GString。然后,它的 compareTo 方法在两种情况下都会被调用 - 当您检查相等性和实际比较时。

编辑:考虑到以下情况,它适用于 1 和 2,但不适用于 3。

customInstance >= 100      // case 1
customInstance == 'hallo' // case 2
customInstance == 10 // case 3

现在我将解释我从 Groovy 的 ScriptBytecodeAdapterDefaultTypeTransformation 实现中所理解的内容。

对于==运算符,如果实现了Comparable(并且没有简单的标识),它会尝试使用接口(interface)方法compareTo,因此与其他比较运算符使用的逻辑相同。仅当 Comparable 未实现时,它才会尝试根据一些智能类型调整来确定相等性,并作为最后的比率回退到调用 equals 方法。这发生在 DefaultTypeTransformation.compareEqual#L603-L608

对于所有其他比较运算符,例如 >=,Groovy 委托(delegate)给 compareToWithEqualityCheck 方法。现在,在将 equalityCheckOnly 标志设置为 false 的情况下调用此方法,而当调用源自 == 运算符时,第一种情况将其设置为 true。同样,如果左侧是数字、字符或字符串,则根据左侧的类型发生一些 Groovy 智能。如果没有适用,它最终会调用DefaultTypeTransformation.compareToWithEqualityCheck#L584-L586中的compareTo方法。 .

现在,只有在以下情况下才会发生这种情况

!equalityCheckOnly || left.getClass().isAssignableFrom(right.getClass())
|| (right.getClass() != Object.class && right.getClass().isAssignableFrom(left.getClass())) //GROOVY-4046
|| (left instanceof GString && right instanceof String)

对于equalityCheckOnly的情况有一些限制,因此当我们来自==运算符时。虽然我无法解释所有这些,但我相信这些是为了防止在特定情况下引发异常,例如评论中提到的问题。

为了简洁起见,我在上面省略了一些情况,如果左侧和右侧都是,则在 ScriptBytecodeAdapter 中预先处理并立即委托(delegate)给 equals相同类型,并且是 Integer、Double 或 Long 之一。

关于用于 CustomClass 和数字/字符串的 Groovy CompareTo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53798075/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com