Kotlin嵌套属性引用
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)
但Im坚持实施。
对于你的假设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 -> c
。 你会经常发现它在标准库中被称为compose
。
Kotlin没有标准的功能组合,但是如果你需要比这更复杂的东西,那么就有图书馆。