Проблема синтаксиса Kotlin - PullRequest
0 голосов
/ 10 июля 2019

Извините за ужасный заголовок, но я не могу найти приемлемый способ задать этот вопрос, потому что я не знаю, как ссылаться на конструкции кода, на которые я смотрю.

Взглядв этом файле: https://github.com/Hexworks/caves-of-zircon-tutorial/blob/master/src/main/kotlin/org/hexworks/cavesofzircon/systems/InputReceiver.kt

Я не понимаю, что здесь происходит:

    override fun update(entity: GameEntity<out EntityType>, context: GameContext): Boolean {
    val (_, _, uiEvent, player) = context

Я могу понять некоторые вещи.

Мы отменяем обновлениефункция, которая определена в классе Behavior, который является суперклассом этого класса.

Функция обновления принимает два параметра.GameEntity с именем entity и GameContext с именем context.

Функция возвращает логический результат.

Однако я совсем не понимаю следующую строку.Просто откройте и закройте круглые скобки, два подчеркивания в качестве первых двух параметров, а затем присваивание аргументу контекста.Для чего мы присваиваем значение контекста?

Основываясь на поведении IDE, очевидно, что закрывающие и закрывающие скобки связаны с конструктором для GameContext.Но я бы не знал, что иначе.Я также не понимаю, что означает подчеркивание в списке аргументов.

И, наконец, я прочитал о ключевом слове дисперсии на сайте объявлений "out", но я не совсем понимаю, что это такоезначит здесь.У нас есть GameEntity,Итак, насколько я понимаю, это означает, что этот метод производит EntityType, но не потребляет его.Как это продемонстрировано в этом коде?

Ответы [ 2 ]

2 голосов
/ 10 июля 2019
val (_, _, uiEvent, player) = context

Вы извлекаете 3-е и 4-е значение из контекста и игнорируете первые два.

Сравнить https://kotlinlang.org/docs/reference/multi-declarations.html.

О out: я не вижу его в фрагменте кода, который вы показываете. Возможно, вы захотите показать полный метод. Также, возможно, это делается только с целью переопределения метода, чтобы соответствовать сигнатуре функции.

1 голос
/ 11 июля 2019

Чтобы охватить немного того, что в противном случае отличный ответ Инкубуса пропустил:

В объявлении

override fun update(entity: GameEntity<out EntityType>, // …

out означает, что вы можете вызвать функцию и передать GameEntity<SubclassOfEntityType> (или даже SubclassOfGameEntity<SubclassOfEntityType>).

Без out вам нужно будет передать GameEntity<EntityType> (или SubclassOfGameEntity<EntityType>).

Я полагаю, это наследуетсяиз метода суперкласса, который вы переопределяете.В конце концов, если метод суперкласса может быть вызван с GameEntity<SubclassOfEntityType>, то ваше переопределение должно будет обрабатывать это тоже.( принцип подстановки Лискова в действии!)

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