【问题标题】:Initialization of val by destructuring in Kotlin在 Kotlin 中通过解构初始化 val
【发布时间】:2017-06-13 08:18:09
【问题描述】:

最初我想实现

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

可以解决

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

    this.rolls = rolls
    this.sides = sides
}

但它不那么优雅。

所以我的问题是:只有在同一行声明 val 时,解构真的可能吗?

【问题讨论】:

    标签: initialization kotlin destructuring


    【解决方案1】:

    此功能称为destructuring declaration,它就是一个声明新变量并立即分配给它们。不仅仅是用val声明的变量不能在以后的解构中使用,更早声明的变量都不能。例如,以下内容也不起作用:

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

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


    15 解构赋值

    Kotlin 已经有解构声明:

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

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

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

    你需要这个功能吗?


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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多