在Kotlin中通过解构来初始化val

时间:2017-06-13 08:18:10

标签: initialization kotlin destructuring

最初我想实现

class NotationDiceRoll(notation: String) {
    val rolls: Int
    val sides: Int

    init {
        parseNotation(notation)
    }

    private fun parseNotation(notation: String) {
        rolls = 1
        sides = 4
    }
}

但Kotlin抱怨说" Val无法重新分配"。

似乎唯一可以分配val的地方是init块。好吧那么,毕竟更加明显。所以我把它改成了

class NotationDiceRoll(notation: String) {
    val rolls: Int
    val sides: Int

    init {
        (rolls, sides) = parseNotation(notation)
    }

    private fun parseNotation(notation: String): Pair<Int, Int> {
        return Pair(1, 4)
    }
}

现在Kotlin抱怨&#34;变量&#39;滚动&#39;必须初始化&#34;。

可以通过

解决
init {
    val(rolls, sides) = parseNotation(notation)

    this.rolls = rolls
    this.sides = sides
}

但不太优雅。

所以我的问题是:只有在相同的行上声明vals,才能真正实现解构吗?

1 个答案:

答案 0 :(得分:2)

此功能称为destructuring declaration,它就是一个新的变量的声明,并立即分配给它们。这不仅仅是用val声明的变量不能用于以后的解构,也没有先前声明的变量可以。例如,以下内容也不起作用:

var x = 0
var y = 0
(x, y) = Pair(1, 2)

值得注意的是,您正在寻找的功能(解构分配)是Kotlin可能在Kotlin 1.1活动中投票的20张卡中可能的未来功能之一。虽然在线调查不再起作用,但您可以在this image上看到该功能的说明,它的卡号是15号。这有点难以辨认,所以这就是它的内容:

15解构分配

Kotlin已经有了解构声明:

val (name, address) = findPerson(...)

有些用户请求解构分配, 即。分配给多个先前声明的var

var name = ...
...
var address = ...
...
(name, address) = findPerson(...)

您需要此功能吗?

更新:here's an official doc with the proposed featureshere's the survey results