gpt4 book ai didi

scala - 判断案例类的字段是否为案例类

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

我试图弄清楚任何给定案例类中的成员字段是否也是案例类。取自this答案,给定一个实例或对象,我可以传递它并确定它是否是一个案例类:

def isCaseClass(v: Any): Boolean = {
import reflect.runtime.universe._
val typeMirror = runtimeMirror(v.getClass.getClassLoader)
val instanceMirror = typeMirror.reflect(v)
val symbol = instanceMirror.symbol
symbol.isCaseClass
}

但是,我想要的是获取一个案例类,提取其所有成员字段,并找出哪些是案例类本身。以这种方式进行的事情:

 def innerCaseClasses[A](parentCaseClass:A): List[Class[_]] = {
val nestedCaseClasses = ListBuffer[Class[_]]()
val fields = parentCaseClass.getClass.getDeclaredFields
fields.foreach(field => {
if (??? /*field is case class */ ) {
nestedCaseClasses += field.getType
}
})
nestedCaseClasses.toList
}

我想也许我可以提取字段、它们的类,并使用反射将该成员字段的新实例实例化为其自己的类。我并不是 100% 知道如何做到这一点,而且似乎也许有一种更简单的方法。有吗?

最佳答案

啊!我已经弄清楚了(简化了告诉确定的函数):

import reflect.runtime.universe._


case class MyThing(str:String, num:Int)
case class WithMyThing(name:String, aThing:MyThing)

val childThing = MyThing("Neat" , 293923)
val parentCaseClass = WithMyThing("Nate", childThing)

def isCaseClass(v: Any): Boolean = {
val typeMirror = runtimeMirror(v.getClass.getClassLoader)
val instanceMirror = typeMirror.reflect(v)
val symbol = instanceMirror.symbol
symbol.isCaseClass
}

def innerCaseClasses[A](parentCaseClass:A): Unit = {
val fields = parentCaseClass.asInstanceOf[Product].productIterator
fields.foreach(field => {
println(s"Field: ${field.getClass.getSimpleName} isCaseClass? " + isCaseClass(field))
})
}

innerCaseClasses(parentCaseClass)

打印输出:

Field: String isCaseClass? false

Field: MyThing isCaseClass? true

关于scala - 判断案例类的字段是否为案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51528757/

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