繁体   English   中英

Kotlin嵌套属性参考

[英]Kotlin nested property reference

data class House(var name: String = "House", var door: Door = Door())
data class Door(var name: String = "Door")

fun test() {
   val testHouse = House("My house", Door(name = "My door"))
}

我如何才能获得嵌套属性引用好又安全,理想情况下是这样的(尽管这不起作用):

   val houseDoorName = House::door::name
   println(houseDoorName.get(testHouse)) //My door

我以为我可以做扩展功能,例如: House::door.nested(Door::name)但是我坚持执行。

对于您的假设nested函数,请尝试以下操作:

fun <A, B, C> ((A) -> B).nested(getter : (B) -> C) : (A) -> C = { getter(this(it)) }

现在,您可以完全按照您的要求进行操作:

val houseDoorName = House::door.nested(Door::name)
val house = House(door = Door(name = "My door"))
println(houseDoorName(house)) // prints "My door"

您也可以将其链接:

val doorNameLength = House::door.nested(Door::name).nested(String::length)

巧妙的窍门是Kotlin允许将属性引用视为函数的方式。

nested函数本质上是一种功能组合。 它接受一个函数a -> b和一个函数b -> c ,并将它们组成一个新函数a- a -> c 在标准库中,您经常会发现它称为compose

Kotlin没有标准的功能组合,但是如果您需要比这更复杂的功能,可以使用那里的库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM