在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有可能吗?
答案 0 :(得分:7)
Destructuring是通过调用正在解构的实例上的函数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())
答案 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
}