在Kotlin中通过解构初始化val

最初我想实现

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抱怨说“变量卷”必须被初始化“。

它可以通过解决

 init { val(rolls, sides) = parseNotation(notation) this.rolls = rolls this.sides = sides } 

但它不那么优雅。

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

这个特性被称为解构声明 ,就是这样,一个新变量的声明 ,立即赋值给它们。 这不仅仅是用val声明的变量不能在以后的解构中使用,也没有前面声明的变量可以使用。 例如,以下内容不起作用:

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

值得注意的是,你正在寻找的功能(解构任务)是Kotlin 1.1中可用的20张牌中Kotlin可能的未来功能之一。 虽然网上调查已经不复存在了,但是你可以看到这张图片上的功能描述,它的卡号是15号。要弄清楚这一点有点难,所以下面是它的内容:


15解构作业

Kotlin已经有了解构声明:

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

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

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

你需要这个功能吗?


更新: 这里是一个官方的文档与建议的功能 , 这里是调查结果 。