2

インクリメント、デクリメント、イコールに演算子のオーバーロードを使用しようとしている次の Groovy コード スニペットがあります。これは、2 つのインスタンスを作成し、インスタンスの 1 つをインクリメントおよびデクリメントしてから、オーバーロードされたメソッド equals を使用して 2 つのインスタンスを比較するだけです。比較をすると失敗します。このコードが完了すると、両方とも 100 になるはずです。(printステートメントはそれを示していますが、toString()関数の1つが間違っているようです)。ここで何が間違っていますか?

これは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
4

2 に答える 2

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
于 2012-05-15T23:06:44.550 に答える
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}"
    }
}
于 2012-05-16T08:47:02.190 に答える