方法返回Kotlin中的元组

时间:2019-03-01 12:52:54

标签: kotlin tuples

我看不到任何在Kotlin中如何使用元组的示例。 我在第一行(方法定义)上遇到的错误是Int ...的“未解决的引用:a”和“期望成员声明”。

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,a为随机值。 从第二次调用开始,我们进入else逻辑。

我觉得官方文档不够用:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-pair/index.html。我确实也尝试了不带“:”的方法名称,例如官方文档 -同样的问题

4 个答案:

答案 0 :(得分:1)

您可以按以下方式重写代码:

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)
}

使用Destructuring Declarations,您可以编写以下内容:

val (a, b) = playingAround(1, 2)

答案 1 :(得分:1)

您使用的语法不正确。应该是这样的:

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)
}

请注意,ab是无法重新分配的方法参数值,因此您需要变量xy来存储结果。

不过,您可以使用更短的语法编写此代码:

private fun playingAround(a: Int, b: Int) = if (b != 0) Pair(a * 2, a) else Pair(a * 3, a)

答案 2 :(得分:1)

您的函数语法不正确。我建议先研究文档。

要使它更具Kotlin惯用性,请使用if作为表达式:

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

答案 3 :(得分:0)

请查看kotlin参考文献的functions chapter和/或尝试使用Kotlin koans来熟悉Kotlin(或者,无论如何,阅读语法是您的最爱,看看function declaration grammar;如果您没有那里写的内容,那没问题。请从教程/参考开始。

其中一种解决方案可能如下所示:

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,也不需要使用解构声明等。