我们在使用对象时可能需要访问它们内部的一些属性:
class Student(var name: String, var age: Int)
fun main() {
val student = Student("小明", 18)
println(student.name)
println(student.age)
}
这样看起来不太优雅,我们可以像下面这样编写:
class Student(var name: String, var age: Int) {
operator fun component1() = name
operator fun component2() = age
}
fun main() {
val student = Student("小明", 18)
val (a, b) = student // 从Student对象中将其属性解构出来
println("${a} ${b}")
}
要让一个类的属性支持解构,我们只需添加约定的函数即可。在Kotlin中,我们可以自定义解构出来的结果,也就是定义componentN
函数并通过返回值的形式返回解构的结果:
class Student(var name: String, var age: Int) {
operator fun component1() = name // 使用 component1 表示解构出来的第一个参数
operator fun component2() = age // 使用 component2 表示解构出来的第二个参数
operator fun component3... // 以此类推
}
如果我们不想用前面的参数,可以用_
忽略掉
class Student(var name: String, var age: Int) {
operator fun component1() = name
operator fun component2() = age
}
fun main() {
val student = Student("小明", 18)
val (_, b) = student // 从Student对象中将其属性解构出来
println(b)
}
解构同样可以用在Lambda表达式中
class Student(var name: String, var age: Int) {
operator fun component1() = name
operator fun component2() = age
}
fun main() {
val student = Student("小明", 18)
val func: (Student) -> Unit = {
(a, b) -> println("${a} ${b}")
}
func(student)
}