Groovy运算符重载递增/递减错误

时间:2012-05-15 21:50:09

标签: groovy operator-overloading overloading

我有以下Groovy代码片段,它试图使用运算符重载来增量,减量和等于。所有这一切都是创建两个实例,执行增量并减少其中一个实例,然后使用重载方法equals比较两个实例。当我进行比较时,它失败了。当此代码完成时,两者都应为100。 (打印语句显示它,但其中一个toString()函数似乎是错误的)。我在这里做错了什么?

这是groovy 1.8.6

class Overload {
    def value

    public Overload(value = 0) {
        this.value = value
    }

    def next() {
        value = value + 1;
    }

    def previous() {
        value = value - 1;
    }

    def boolean equals(other) {
        if (value == other?.value) {
            return true
        }

        return false
    }

    def String toString() {
        "value is = ${value}"
    }
}

def cls1 = new Overload(100)
def cls2 = new Overload(100)

cls1++
cls1--
if (cls1 == cls2) {
    println("cls1 == cls2")
}
else {
    println("cls1 != cls2")
}

println(cls1.toString())
println(cls2.toString())

输出:

cls1 != cls2
100
value is = 100

2 个答案:

答案 0 :(得分:6)

问题是Overload实例的增量和减量方法。

Groovy具有为最后一个计算表达式隐式返回的功能。当你致电cls1++时,现在对象是一个整数,这就是我们没有看到覆盖toString方法的输出的原因。

def next() {
    value = value + 1
    return this
}

def previous() {
    value = value - 1
    return this
}

立即检查:

assert cls1.class == Overload
assert cls2.class == Overload
assert cls1 == cls2
assert cls1 == 100
assert cls2 == 100

答案 1 :(得分:1)

作为一个快速的附加注释,在定义方法的返回类型时,您不需要使用def。您班级的清洁版本是:

class Overload {
    def value

    public Overload(value = 0) {
        this.value = value
    }

    def next() {
        value = value + 1
        this
    }

    def previous() {
        value = value - 1
        this
    }

    boolean equals(other) {
        value == other?.value
    }

    String toString() {
        "value is = ${value}"
    }
}