Метод возвращает кортежи в Котлин - PullRequest
0 голосов
/ 01 марта 2019

Я не вижу примеров использования кортежей в Kotlin.Ошибки, которые я получаю в первой строке (определение метода), это «неразрешенная ссылка: a» и «объявление ожидающего члена» для Int ...

private fun playingAround : Pair<out a: Int, out b: Int> {
        if(b != 0) {
            b = a
            a = a * 2
        } else {
            b = a
            a = a * 3
        }

        return Pair(a, b)
    }

О логике: b в начале равно 0имеет случайное значение.Со второго вызова мы переходим к логике else.

Я не чувствую, что официального документа достаточно: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-pair/index.html. Я пробовал также без ":" после имени метода, напримерофициальный документ, кажется, подразумевает ту же проблему

Ответы [ 4 ]

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

Пожалуйста, ознакомьтесь с разделом функций справочника kotlin и / или поиграйтесь с Kotlin koans , чтобы ознакомиться с Kotlin (или, если каким-либо образом, читаетеГрамматика - ваш любимый, посмотрите вместо этого на объявление функции ; если вы не понимаете, что там написано, нет проблем. Начните с учебников / ссылок вместо этого).

Один изрешения могут выглядеть следующим образом:

private fun playingAround(a: Int, b: Int) = b.let {
    if (it != 0) a * 2
    else a * 3
} to a

или, если вы имели в виду, что вы действительно хотите передать пару, то, возможно, лучше следующее:

private fun playingAround(givenPair: Pair<Int, Int>) = givenPair.let { (a, b) ->
    b.let {
        if (it != 0) a * 2
        else a * 3
    } to a
}

Трудно действительнознаете, чего вы хотели достичь, так как вы не указали, что это такое.

Функция расширения?Для полноты:

private fun Pair<Int, Int>.playingAround() = let { (a, b) ->
    b.let {
        if (it != 0) a * 2
        else a * 3
    } to a
}

и, конечно: вам не нужно ни использовать let, ни использовать to, ни использовать объявления о деструктурировании и т. Д. Есть только некоторые из многих возможных решений.

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

Вы используете неправильный синтаксис.Это должно быть что-то вроде этого:

private fun playingAround(a: Int, b: Int): Pair<Int, Int> {
    val x: Int
    val y: Int

    if (b != 0) {
        y = a
        x = a * 2
    } else {
        y = a
        x = a * 3
    }

    return Pair(x, y)
}

Обратите внимание, что a и b являются значениями параметров метода, которые не могут быть переназначены, поэтому вам нужны переменные x и y для хранения результата.

Вы можете написать это с гораздо более коротким синтаксисом:

private fun playingAround(a: Int, b: Int) = if (b != 0) Pair(a * 2, a) else Pair(a * 3, a)
0 голосов
/ 01 марта 2019

Ваш синтаксис функции неправильный.Я предлагаю сначала изучить документацию.

Чтобы сделать это немного более идиоматическим по Kotlin, используйте if в качестве выражения:

private fun playingAround(a: Int, b: Int): Pair<Int, Int> =
    if (b != 0) {
        Pair(a * 2, a)
    } else {
        Pair(a * 3, a)
    }
0 голосов
/ 01 марта 2019

Вы можете переписать свой код следующим образом:

private fun playingAround(a: Int, b: Int) : Pair<Int, Int> {
    val tempA: Int
    val tempB: Int
    if(b != 0) {
        tempB = a
        tempA = a * 2
    } else {
        tempB = a
        tempA = a * 3
    }

    return Pair(tempA, tempB)
}

И, используя Декларации о разрушении , вы можете написать следующее:

val (a, b) = playingAround(1, 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...