如何获取匿名函数参数信息?

问题描述 投票:0回答:1
// normal function 
fun something(a: String, b: String): String {
    return "$a $b"
}
println(::something.parameters) <- not empty

但是

// anonymous function 
var something = fun(a: String, b: String): String {
    return "$a $b"
}
println(::something.parameters) <- empty

如何获取匿名函数参数信息?

kotlin anonymous-function
1个回答
0
投票

在第二个代码片段中,

something
是一个属性,因此
::something
是对属性的引用。
::something
属于
KMutableProperty0<(String, String) -> String>
类型。你显然不想获取 property 的参数。

您想要的“函数”是存储在

something
中的值,所以理想情况下您只需执行
something.parameters
即可。然而,
something
(String, String) -> String
,而不是
KFunction
,所以你无法对其进行反思。

有一个实验性 API,可以为您提供代表

KFunction
(String, String) -> String
-
reflect

所以你可以这样做:

var something = fun(a: String, b: String): String {
    return "$a $b"
}
@OptIn(ExperimentalReflectionOnLambdas::class)
fun main() {
    println(something.reflect()?.parameters)
}

对于语言版本(不是编译器版本)2.0,lambda 和匿名函数现在使用

invokedynamic
调用 创建,而
reflect
无法使用这些。

要使其在 2.0 中工作,您可以像这样注释该函数:

var something = @JvmSerializableLambda 
    fun(a: String, b: String): String { ... }

或使用

-Xlambdas=class
编译器选项。其中任何一个都会使匿名函数编译为类(2.0 之前的旧行为)。

© www.soinside.com 2019 - 2024. All rights reserved.