Переопределить оператор приращения в groovy - PullRequest
0 голосов
/ 18 марта 2019

Согласно документации я должен иметь возможность переопределить оператор приращения, но что-то идет не так.

class Feb{
    def nMinusOne = 1L
    def current = 1L

    def next(){
        def buff = nMinusOne + current
        nMinusOne = current
        current = buff
        return current
    }
}

def feb = new Feb()
print("${feb.nMinusOne}, ${feb.current}, ")
for(def i = 0; i < 44; i++)
    print("${++feb}, ") // expected behavior: print("${feb.next()}, ")

Ожидаемый результат:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903,

Фактический результат:

1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,

Я что-то упустил? Также я заметил, что после вызова инкремента, если я пытаюсь обновить свою переменную feb, ее класс изменился на Integer:

print("${feb.nMinusOne} ${feb.class}, ${feb.current} ${feb.class}")
for(def i = 0; i < 44; i++) {
    print("${(++feb)} ${feb.class}, ")
}
1 class Feb, 1 class Feb2 class java.lang.Integer, 3 class java.lang.Integer, 4 class java.lang.Integer, 5 class java.lang.Integer, 6 class java.lang.Integer, 7 class java.lang.Integer, 8 class java.lang.Integer, 9 class java.lang.Integer, etc

заводная версия: 2.4.15

1 Ответ

0 голосов
/ 18 марта 2019

Я перепутал с типом возврата #next метода.Очевидно, вы должны вернуть себе:

class T{
    /* ...*/
    T next(){
        /* ...*/
        return this
    }
}

def instance = new T()
def copy = new T()
assert ++instance == copy.next()

Мой код после изменений

class Feb{
    def prev = 1L
    def current = 1L

    def next(){
        def buff = prev + current
        prev = current
        current = buff
        return this // return type now is Feb
    }

    String toString(){
        return current.toString()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...