gpt4 book ai didi

function - Kotlin 使用数据类发送函数参数

转载 作者:行者123 更新时间:2023-12-05 03:36:50 25 4
gpt4 key购买 nike

假设我有课:

class Foo {
fun doSomething(param1: Int, param2: String, param3: String)
}

和一个数据类

data class Params(
val param1: Int,
val param2: String,
val param3: String)

现在我想使用数据类参数将它们发送给函数,有没有办法做到这一点?让我们说类似的话:

val myParams = Params(1, "2", "3")
val foo = Foo()
foo.doSomething(myparams)

或者通过某种转换或方法命名。作为:

 execute(foo, foo::doSomething, myParams)

最佳答案

我怀疑在没有一些技巧的情况下,这在 Kotlin 中是可能的。可能的解决方案是反射 API 和代码生成。

使用反射的例子:

fun main() {
val myParams = Params(1, "2", "3")
val foo = Foo()

invokeWithParams(foo::doSomething, myParams)
}

fun <T : Any, R> invokeWithParams(func: KFunction<R>, params: T): R {
val paramValues = func.parameters.map { kparam ->
(params::class as KClass<T>)
.memberProperties
.single { it.name == kparam.name }
.get(params)
}.toTypedArray()
return func.call(*paramValues)
}

它应该适用于静态函数、成员函数和扩展函数。它可能会在一些罕见的情况下失败。您可能应该添加一些错误处理,例如检查参数是否匹配。

它不会在 JVM 以外的任何其他目标上工作,因为反射在其他目标上仍然非常有限。

此外,对于这种不安全的转换,我并不完全确定。我认为它不会失败,但我对此不是 100% 确定。

更新:

我们可以通过将函数转换为扩展 operator invoke 让它变得更有趣:

operator fun <T : Any, R> KFunction<R>.invoke(params: T): R

然后我们可以像这样将它与任何函数一起使用:

(foo::doSomething)(myParams)

我不确定这是否是个好主意,因为它比显式调用效用函数更令人困惑。

关于function - Kotlin 使用数据类发送函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69532915/

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