加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

斯卡拉得到案件类的领域和类型

发布时间:2020-12-16 19:16:37 所属栏目:安全 来源:网络整理
导读:所以我试图在一个案例类中得到字段及其类型.目前我这样做 typeOf[CaseClass].members.filter(!_.isMethod).foreach{ x = x.typeSignature match { case _:TypeOfFieldInCaseClass = do something case _:AnotherTypeOfFieldInCaseClass = do something }} 问
所以我试图在一个案例类中得到字段及其类型.目前我这样做

typeOf[CaseClass].members.filter(!_.isMethod).foreach{
   x =>
     x.typeSignature match {
        case _:TypeOfFieldInCaseClass => do something
        case _:AnotherTypeOfFieldInCaseClass => do something
     }
}

问题是x.typeSignature的类型为reflect.runtime.universe.Type,它与case类中的任何类型都不匹配.有办法做到这一点吗?

解决方法

假设您定义了以下案例类:

case class CaseClass(i: Int,s: String)

通过模式匹配,您可以通过以下方式实现您想要的效果:

import scala.reflect.runtime.universe._

typeOf[CaseClass].members.filter(!_.isMethod).map(_.typeSignature).foreach {
  case t if t == typeOf[Int] => print("i")
  case s if s == typeOf[String] => print("s")
}

为什么?

那么为什么第一次尝试不起作用呢?

那是因为在你的代码中你使用的是类型模式.类型模式在运行时检查主题匹配的类型 – 在这种情况下是类型签名.因此,通过使用_:Int,我们要求在运行时针对CaseClass的非方法成员的每个类型签名进行类型检查.

但在这种情况下,我们需要的是价值匹配.

让我们仔细看看(使用Scala REPL):

scala> case class CaseClass(i: Int,s: String)
defined class CaseClass

scala> typeOf[CaseClass]
res1: reflect.runtime.universe.Type = CaseClass

scala> typeOf[CaseClass].members
res2: reflect.runtime.universe.MemberScope = Scopes(method equals,method toString,..)

scala> typeOf[CaseClass].members.filter(!_.isMethod)
res4: Iterable[reflect.runtime.universe.Symbol] = SynchronizedOps(value s,value i)

scala> typeOf[CaseClass].members.filter(!_.isMethod).map(_.typeSignature)
res5: Iterable[reflect.runtime.universe.Type] = List(String,scala.Int)

所以我们想要匹配的是reflect.runtime.universe.Type类型.请注意,在最后一行中,String和scala.Int只是这些类型的字符串表示而不是它们的实际类型!

所以我们需要将它们与这种类型的不同值相匹配,我们可以使用typeOf [Int]和typeOf [String]轻松获得这些值.

更多关于Scala中的模式匹配

您可能希望使用以下代码使代码更简洁:

typeOf[CaseClass].members.withFilter(!_.isMethod).map(_.typeSignature).foreach {
  case typeOf[Int] => print("i")    // Won't Compile!
  case typeOf[Int] => print("s")    // Won't Compile
}

但这会给你以下编译错误:

not found: type typeOf

再次这是因为我们需要匹配以大写字母开头的变量名称.以下是有效的:

val T = typeOf[Int]
val S = typeOf[String]

typeOf[CaseClass].members.withFilter(!_.isMethod).map(_.typeSignature).foreach {
  case T => print("i")
  case S => print("s")
}

有关模式匹配的更多详细信息,请参阅Programming in Scala.您可以在此找到模式匹配的详细说明.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读