gpt4 book ai didi

kotlin - 如何在 Kotlin 中嵌套多个属性委托(delegate)

转载 作者:行者123 更新时间:2023-12-02 13:33:07 28 4
gpt4 key购买 nike

我遇到过一种情况,我想“链接”多个委托(delegate)(将一个委托(delegate)的输出连接到另一个委托(delegate))。

这似乎是可能的:

private val errorLogList by listSO(listOf<StateObject<Luxeption>>(), SODest.NONE, publicSOAccessRights())
val errorLog: StateObject<List<StateObject<Luxeption>>> by addToSet(errorLogList)

但是,这看起来不太好:)。我想像这样在一行中做到这一点:

val errorLog: StateObject<List<StateObject<Luxeption>>> by addToSet(
listSO(listOf<StateObject<Luxeption>>(), SODest.NONE, publicSOAccessRights())
)

我的问题: 在 Kotlin 中可以通过委托(delegate)创建这种类型的属性吗?

以下是我的委托(delegate)的两个实现:

添加到设置:

open class ChildSOReturner {

val set: Set<StateObject<*>> = setOf()

inline fun <reified T> addToSet(so: T) = object: ReadOnlyProperty<Any?, T> {
override operator fun getValue(thisRef: Any?, property: KProperty<*>): T {
if (thisRef is T) {
set.plus(so)
return so
} else throw IllegalArgumentException()
}
}
}

列表所以:

fun <O> listSO(
initialState: List<StateObject<O>>,
soDest: SODest,
soAccessRights: SOAccessRights
) = object : ReadOnlyProperty<Any?, StateObject<List<StateObject<O>>>> {

override operator fun getValue(thisRef: Any?, property: KProperty<*>): StateObject<List<StateObject<O>>> {
val meta = SOMeta(SOId(property.name), soDest, soAccessRights)
return StateObjectList(initialState, meta)
}

}

最佳答案

事实证明这很棘手,但有可能(除非我遗漏了一些东西,而且它没有经过测试,但这个想法应该可行):

fun <T, U, V> composeProperties(prop: ReadOnlyProperty<T, U>, f: (U) -> ReadOnlyProperty<T, V>) : ReadOnlyProperty<T, V> {
var props = mutableMapOf<Pair<T, KProperty<*>>, ReadOnlyProperty<T, V>>()
return object : ReadOnlyProperty<T, V> {
override operator fun getValue(thisRef: T, property: KProperty<*>): V {
val prop1 = props.getOrPut(Pair(thisRef, property)) {
f(prop.getValue(thisRef, property))
}
return prop1.getValue(thisRef, property)
}
}
}

然后使用
val errorLog: ... by composeProperties(listSO(...)) { addToSet(it) }

关于kotlin - 如何在 Kotlin 中嵌套多个属性委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60121685/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com