gpt4 book ai didi

Scala 对函数参数名称的反射

转载 作者:行者123 更新时间:2023-12-04 19:58:58 25 4
gpt4 key购买 nike

我有一个带有函数的类

 case class FunctionParser1Arg[T, U](func:(T => U))

def testFunc(name1:String):String = name1
val res = FunctionParser1Arg(testFunc)

我想知道案例类内部函数的类型签名信息。我想知道参数名称和类型。我已经成功地使用运行时镜像对象找到了类型,但没有找到名称。有什么建议吗?

最佳答案

好的,假设您得到了 func 指向的实例的符号:

import scala.reflect.runtime.universe._
import scala.reflect.runtime.{currentMirror => m}

val im = m reflect res.func // Instance Mirror

你可以从它的类型成员中获取apply方法:

val apply = newTermName("apply")
val applySymbol = im.symbol.typeSignature member apply

既然我们知道它是一个方法,就把它变成一个方法符号:

val applyMethod = applySymbol.asMethod

它的参数可以通过paramss找到,我们知道一个参数列表上只有一个参数,所以我们可以得到第一个参数列表的第一个参数:

val param = applyMethod.paramss(0)(0)

那么你要的是:

val name = param.name.decoded // if you want "+" instead of "$plus", for example
val type = param.typeSignature

您可能认为这是错误的答案,因为您得到的是 x$1 而不是 name1,但是传递给构造函数的不是命名函数 testFunc,而是一个匿名函数,表示通过称为 eta 扩展 的过程创建的该方法。您无法找到方法的参数名称,因为您无法传递该方法。

如果这正是您所需要的,我建议您改用宏。使用宏,您将能够准确地看到在编译时传递的内容并从中获取名称。

关于Scala 对函数参数名称的反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16472854/

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