2016-03-02 71 views
4

在科特林數據類可以被解構,像這樣:是否可以在Kotlin中爲非數據類實現自定義解構?

fun main(args: Array<String>) { 
    val thing = Stuff(1, "Hi", true) 
    val(thing1, thing2, thing3) = thing 

    println(thing1) 
} 

data class Stuff(val thing1: Int, val thing2: String, val thing3: Boolean) 

我可以誤讀文檔,或者也許我只是找不到一個例子,但是我正在尋找一種方式來實現定製拆解非數據類。 Kotlin可能嗎?

回答

4

我是能夠使這項工作是這樣的:

fun main(args : Array<String>) { 
    val person = Person("first", "last") 
    val(param1, param2) = person 
    println(param1) 
    println(param2) 
} 

class Person(val firstName: String, val lastName: String) { 
    operator fun component1() = firstName 
    operator fun component2() = lastName 
} 
7

Destructuring是通過調用函數component1component2component3等,在實例被解構執行。

這些函數可以是在您的類中聲明的成員函數或擴展函數。另外組件函數必須有關鍵字operator來表示它們要滿足一個約定,即解構一個約定。

對於數據類,編譯器爲其主構造函數中聲明的每個數據類屬性生成相應的組件函數。

與自定義組件的功能類的實例:

class Result(val e: Exception?) { 
    val hasFailed = e != null 

    operator fun component1(): Exception? = e 
    operator fun component2(): Boolean = hasFailed 
} 

val (e, hasFailed) = Result(RuntimeException()) 
相關問題