gpt4 book ai didi

reflection - Kotlin:使用(输出)反射比较不同目标对象的属性值

转载 作者:行者123 更新时间:2023-12-03 23:48:34 26 4
gpt4 key购买 nike

我想比较一个数据类的多个实例之间的值,以便我知道哪个值发生了变化:

data class A(val name : String)
val firstA = A("hello")
val secondA = A("you")

if (secondA.name.changed(firstA)) {
// Do something
}

我可以以某种方式访问​​ .name 的属性函数吗?并在没有明确定义的情况下在另一个目标值上执行它(在本例中是在 firstA 上)?
代表可以在这里提供帮助,或者我如何在有和没有反射(reflection)的情况下解决这个问题?

最佳答案

没有反射

我找到了一种不使用反射的方法:

interface DiffValue<T> {
val old : T?
}

fun <T,R> T.changed(memberAccess : T.() -> R) : Boolean {
if (this is DiffValue<*>) {
val old = this.old as? T
if (old != null) {
val currentValue = with(this, memberAccess)
val previousValue = with(old, memberAccess)
return currentValue != previousValue
}
}
return true
}

这就是你如何使用它:
data class A(val val name: String, override val old : A? = null)
val firstA = A("hello")
val secondA = A("you", firstA)

if (secondA.changed {name}) {
// Do something
}

这是基于 lambda literals with receivers 的概念允许 Kotlin 构建强大的构建器和 DSL。

注意: DiffValue interface 是可选的,仅用于使值保持在一起更容易一些并避免 changed 中的附加参数.

关于reflection - Kotlin:使用(输出)反射比较不同目标对象的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46792185/

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