kotlin 无法调用具有两个返回变量的函数

w1e3prcc  于 2023-01-31  发布在  Kotlin
关注(0)|答案(1)|浏览(143)

我刚到Kotlin,我已经成功地调用了一个函数返回两个变量else where在我的代码,但它给予了一个错误,当使用如图所示。一切工作,直到我决定我想要返回两个变量。我可以让它工作,如果我使用if then语句,但这是不干净的。有没有办法做到这一点使用lambda?它告诉我第一个值是expression unused,第二个值是布尔值。

fun block (puzzle: Array<IntArray>, x:Int, y:Int): Pair<MutableList<Int>, MutableSet<Int>> {
    var blockNums: MutableList<Int> = mutableListOf()
    var blockNumsFinal: MutableSet<Int> = mutableSetOf()
    when {
        ((x in 0..2) and (y in 0..2)) -> (blockNums, blockNumsFinal) = getBlock1(puzzle, x, y)
        ((x in 3..5) and (y in 0..2)) -> blockNums = getBlock2(puzzle, x, y)
        ((x in 6..8) and (y in 0..2)) -> blockNums = getBlock3(puzzle, x, y)
        ((x in 0..2) and (y in 3..5)) -> blockNums = getBlock4(puzzle, x, y)
        ((x in 3..5) and (y in 3..5)) -> blockNums = getBlock5(puzzle, x, y)
        ((x in 6..8) and (y in 3..5)) -> blockNums = getBlock6(puzzle, x, y)
        ((x in 0..2) and (y in 6..8)) -> blockNums = getBlock7(puzzle, x, y)
        ((x in 3..5) and (y in 6..8)) -> blockNums = getBlock8(puzzle, x, y)
        ((x in 6..8) and (y in 6..8)) -> blockNums = getBlock9(puzzle, x, y)
    }
    return Pair(blockNums, blockNumsFinal)
}

我在谷歌搜索中没有找到答案。

vltsax25

vltsax251#

这一点:

(blockNums, blockNumsFinal) =

看起来你试图对已经声明的变量使用一个反结构 * 声明 * 语法。这是不允许的。你只能用它来声明(因此得名)。
因为你的另一个函数显然已经返回了一个对,所以这应该可以工作,但是我猜测是因为我不确定你的其他函数的返回类型。
你还误用了and中缀函数。它是用于逐位比较的。当用于布尔表达式时,它可以防止过早退出总计表达式,这意味着如果第一个表达式为假,它仍然会冗余地计算第二个表达式。这不是你想要的。你应该在这里使用&&

fun block (puzzle: Array<IntArray>, x:Int, y:Int): Pair<MutableList<Int>, MutableSet<Int>> {
    return when {
        ((x in 0..2) && (y in 0..2)) -> getBlock1(puzzle, x, y)
        ((x in 3..5) && (y in 0..2)) -> getBlock2(puzzle, x, y)
        ((x in 6..8) && (y in 0..2)) -> getBlock3(puzzle, x, y)
        ((x in 0..2) && (y in 3..5)) -> getBlock4(puzzle, x, y)
        ((x in 3..5) && (y in 3..5)) -> getBlock5(puzzle, x, y)
        ((x in 6..8) && (y in 3..5)) -> getBlock6(puzzle, x, y)
        ((x in 0..2) && (y in 6..8)) -> getBlock7(puzzle, x, y)
        ((x in 3..5) && (y in 6..8)) -> getBlock8(puzzle, x, y)
        ((x in 6..8) && (y in 6..8)) -> getBlock9(puzzle, x, y)
        else -> Pair(mutableListOf(), mutableSetOf())
    }
}

关于您尝试使用的语法,如果存在,则称为"解构 * 赋值 *"。There's a feature request on the Kotlin YouTrack page for it.

相关问题