Kotlin中when表达式调用返回Pair的函数报错问题
Kotlin when表达式中解构赋值与条件判断的问题解决
问题根源
- 条件判断运算符错误:你用了位运算
and而非逻辑与&&。x in 0..2返回布尔值,and会将布尔值转为Int(true=1,false=0),导致when分支条件不是布尔类型,触发“期望布尔值”的报错。 - 解构赋值写法与变量初始化问题:第一个分支的解构赋值虽然语法合法,但其他分支未对
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
相关产品推荐
相关产品推荐

