是否可以在Kotlin中为非数据类实现自定义解构?

时间:2016-03-02 01:48:10

标签: kotlin

在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有可能吗?

2 个答案:

答案 0 :(得分: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())

答案 1 :(得分:5)

我能够做到这一点:

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
}