You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中when表达式调用返回Pair的函数报错问题

Kotlin when表达式中解构赋值与条件判断的问题解决

问题根源

  1. 条件判断运算符错误:你用了位运算and而非逻辑与&&。x in 0..2返回布尔值,and会将布尔值转为Int(true=1,false=0),导致when分支条件不是布尔类型,触发“期望布尔值”的报错。
  2. 解构赋值写法与变量初始化问题:第一个分支的解构赋值虽然语法合法,但其他分支未对blockNumsFinal赋值,同时编译器误判条件表达式的返回值类型,导致“第一个值表达式未使用”的提示。

修正方案1:修复原代码逻辑

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 {
        // 替换位运算and为逻辑与&&
        x in 0..2 && y in 0..2 -> {
            // 用大括号包裹解构赋值逻辑,更清晰
            val (nums, finalNums) = getBlock1(puzzle, x, y)
            blockNums = nums
            blockNumsFinal = finalNums
        }
        x in 3..5 && y in 0..2 -> blockNums = getBlock2(puzzle, x, y)
        x in 6..8 && y in 0..2 -> blockNums = getBlock3(puzzle, x, y)
        x in 0..2 && y in 3..5 -> blockNums = getBlock4(puzzle, x, y)
        x in 3..5 && y in 3..5 -> blockNums = getBlock5(puzzle, x, y)
        x in 6..8 && y in 3..5 -> blockNums = getBlock6(puzzle, x, y)
        x in 0..2 && y in 6..8 -> blockNums = getBlock7(puzzle, x, y)
        x in 3..5 && y in 6..8 -> blockNums = getBlock8(puzzle, x, y)
        x in 6..8 && y in 6..8 -> blockNums = getBlock9(puzzle, x, y)
    }
    return Pair(blockNums, blockNumsFinal)
}

修正方案2:更简洁的写法(推荐)

让when直接返回Pair,避免提前声明变量,代码更紧凑:

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) to mutableSetOf()
        x in 6..8 && y in 0..2 -> getBlock3(puzzle, x, y) to mutableSetOf()
        x in 0..2 && y in 3..5 -> getBlock4(puzzle, x, y) to mutableSetOf()
        x in 3..5 && y in 3..5 -> getBlock5(puzzle, x, y) to mutableSetOf()
        x in 6..8 && y in 3..5 -> getBlock6(puzzle, x, y) to mutableSetOf()
        x in 0..2 && y in 6..8 -> getBlock7(puzzle, x, y) to mutableSetOf()
        x in 3..5 && y in 6..8 -> getBlock8(puzzle, x, y) to mutableSetOf()
        x in 6..8 && y in 6..8 -> getBlock9(puzzle, x, y) to mutableSetOf()
        else -> mutableListOf() to mutableSetOf() // 兜底分支,防止编译报错
    }
}

Lambda扩展写法

如果某个分支需要复杂逻辑,可以用run lambda包裹:

x in 0..2 && y in 0..2 -> run {
    // 这里可以添加额外处理逻辑
    getBlock1(puzzle, x, y)
}

内容的提问来源于stack exchange,提问作者JD74

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:20:41