簡體   English   中英

通過在Kotlin中進行銷毀來初始化val

[英]Initialization of val by destructuring in Kotlin

最初我想實現

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)
    }
}

現在,科特林抱怨“必須初始化變量“卷””。

可以解決

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

    this.rolls = rolls
    this.sides = sides
}

但它不太優雅。

所以我的問題是:只有在同一行上聲明val時,銷毀真的可能嗎?

該功能被稱為解構聲明 ,這是它是什么,立即指派給他們的新變量的聲明 不僅是用val聲明的變量不能在以后的解構中使用,更早的聲明的變量也不能用。 例如,以下方法也不起作用:

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

值得一提的是,您正在尋找的功能(解構任務)是Kotlin將來可能使用的功能之一,在Kotlin 1.1活動中可投票的20張卡中。 雖然不再進行在線調查,但是您可以在這張圖片上看到該功能的描述,它的卡號為15。這很難辨認,所以這里是其中的內容:


15個銷毀任務

Kotlin已經有銷毀聲明:

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

一些用戶請求銷毀分配,即。 分配給多個先前聲明的var

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

您需要此功能嗎?


更新: 這是具有建議功能的正式文檔這是調查結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM