在比较中忽略Triple的组件

时间:2018-01-07 05:53:40

标签: kotlin tuples

我正在尝试比较Triple,同时忽略Triple的某些值。我希望忽略的值由_表示。请注意,以下代码仅供参考,不会编译,因为_Unresolved reference

val coordinates = Triple(3, 2, 5)
when (coordinates) {
    Triple(0, 0, 0) -> println("Origin")
    Triple(_, 0, 0)-> println("On the x-axis.")
    Triple(0, _, 0)-> println("On the y-axis.")
    Triple(0, 0, _)-> println("On the z-axis.")
    else-> println("Somewhere in space")
}

我知道您可以在destructuring时使用_,如果您想忽略某个值,但这似乎无助于我解决上述问题:

val (x4, y4, _) = coordinates
println(x4)
println(y4)

我是如何实现这一目标的?

谢谢!

1 个答案:

答案 0 :(得分:5)

在Kotlin 1.1中引入了未使用变量的下划线,它被设计为在解构声明中不需要某些变量时使用。

在表达式的分支条件中,Triple(0, 0, 0)正在创建新实例但不会解构。因此,此处不允许使用下划线。

目前,在Kotlin中无法表达的分支条件下进行解构。您的案例的解决方案之一是在每个分支条件中详细比较每个组件:

val (x, y, z) = Triple(3, 2, 5)
when {
    x == 0 && y == 0 && z == 0 -> println("Origin")
    y == 0 && z == 0 -> println("On the x-axis.")
    x == 0 && z == 0 -> println("On the y-axis.")
    x == 0 && y == 0 -> println("On the z-axis.")
    else -> println("Somewhere in space")
}

Here是关于表达时的解构的讨论。