2016-03-02 44 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()) 
相关问题