Функция перегрузки оператора не внутри фигурных скобок {} - PullRequest
0 голосов
/ 05 марта 2019

Я выполняю упражнение Перегрузка операторов Kotlin Koans , и ответ включает в себя следующий класс:

class RepeatedTimeInterval(val timeInterval: TimeInterval, val number: Int)
operator fun TimeInterval.times(number: Int) = RepeatedTimeInterval(this, number)

Я немного запутался, почему функция operatorне в боковых фигурных скобках {}.

Во всех уроках, которые я видел ( пример ), оператор всегда находится внутри фигурных скобок:

class Point(val x: Int = 0, val y: Int = 10) {

    // overloading plus function
    operator fun plus(p: Point) : Point {
        return Point(x + p.x, y + p.y)
    }
}

На самом деле я никогда не видел ни одной функцииэтот синтаксис, где нет символа между конструктором класса и следующей функцией.

Ответы [ 2 ]

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

В первом примере вы перегружаете оператора, предоставляя функцию расширения .В Kotlin вы можете добавить функции в любой существующий класс.Под прикрытием это работает как статический метод в Java.

Оба эти примера перегружают оператор "плюс" в вашем Point классе:

class Point(val x: Int = 0, val y: Int = 10) {

    operator fun plus(p: Point) : Point {
        return Point(x + p.x, y + p.y)
    }
}

Или с использованием функции расширения:

class Point(val x: Int = 0, val y: Int = 10)
operator fun Point.plus(p: Point) : Point {
    return Point(x + p.x, y + p.y)
}

Они оба выглядят одинаково, когда вы их называете:

val p = Point(1, 2)
val x = p + p // x = 2, 4
0 голосов
/ 05 марта 2019

Функция, которую вы видите, не является методом класса;он не определен внутри класса и не является частью класса.(Это может быть даже определено в другом файле или в другом пакете целиком.)

Вместо этого это функция расширения : автономная функция, которая не является частьюкласс, но ведет себя в некоторых отношениях, как если бы это было.

Вы можете сказать, потому что имя функции имеет . в нем.Это говорит компилятору, что функция расширяет класс до ..

Если функция расширения находится в области видимости, вы можете вызывать ее, используя тот же синтаксис, который вы используете для вызова методов;а внутри функции this относится к экземпляру класса («получателю»).Однако вы не можете получить доступ к закрытым методам или свойствам класса;this может быть нулевым, если он расширяет обнуляемый тип;и функция разрешается статически (во время компиляции, как вызовы функций; не во время выполнения, как вызовы методов).

Это одна из важных функций Kotlin, поэтому ее стоит прочитать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...