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

zju*_*asz 5 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)
Run Code Online (Sandbox Code Playgroud)

我可能会误读文档,或者我可能找不到一个例子,但我正在寻找一种方法来实现非数据类的自定义解构.这在Kotlin有可能吗?

Ily*_*lya 7

拆解是通过调用函数执行component1,component2,component3等,在实例被解构.

这些函数可以是在类中声明的成员函数,也可以是扩展函数.组件函数也必须有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())
Run Code Online (Sandbox Code Playgroud)


And*_*dEx 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
}
Run Code Online (Sandbox Code Playgroud)