Перегрузка оператора как функция расширения - PullRequest
0 голосов
/ 24 февраля 2019

В моей игре у меня два игрока, поэтому я определил typealias пары, который должен указывать, что у меня есть две вещи одного типа, и .first принадлежит первому игроку, а .second принадлежит второму игроку:

typealias PlayerPair<A> = Pair<A, A>

Также я определил этот перечислимый класс

enum class PlayerNumber {
    One,
    Two
}

Теперь я хотел бы добавить оператор (в качестве функции расширения) для доступа к таким элементам, как этот

myPair[Player.One]

Это мой подход, но он не работает

operator fun PlayerPair.get(i: PlayerNumber) = when (i) {
    PlayerNumber.One -> PlayerPair.first
    PlayerNumber.Two -> PlayerPair.sexond
}

Добавление ветки else устраняет одну ошибку, но я не понимаю, почему это необходимо.

Другая ошибка - 'Oneожидается тип аргумента для typealias PlayerPair = Pair '.

Но я не могу понять, что это значит в этом контексте.

1 Ответ

0 голосов
/ 24 февраля 2019

Вы можете создать общую функцию get, вам просто нужно указать параметр типа, и вы расширяете PlayerPair<T>:

operator fun <T> PlayerPair<T>.get(i: PlayerNumber): T = when (i) {
    PlayerNumber.One -> this.first
    PlayerNumber.Two -> this.second
}

Внутри оператора вы можете обратиться кэкземпляр PlayerPair<T> как this, который вы также можете использовать неявно:

operator fun <T> PlayerPair<T>.get(i: PlayerNumber): T = when (i) {
    PlayerNumber.One -> first
    PlayerNumber.Two -> second
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...