是否已经有一种模式匹配替代方案来编写像
这样的长卷绕测试if (aTpe =:= typeOf[Int]) 1
else if (aTpe =:= typeOf[Long]) 2
else if (aTpe =:= typeOf[Double]) 3
else ...
也许看起来有点像
aTpe match {
case tpe[Int] => 1
case tpe[Long] => 2
case tpe[Doble] => 3
...
}
为此编写一个提取器看起来很容易,但我想知道是否还没有这样的东西。
答案 0 :(得分:2)
到目前为止,我在普通代码中所做的是物化类型。我想它也可以在宏中使用:
val ClassOfInt = classOf[Int]
val ClassOfLong = classOf[Long]
aTpe match {
case ClassOfInt => 1
case ClassOfLong => 2
}
它有效,但我非常想知道是否有一种'更加'的方式。
答案 1 :(得分:1)
当然可以使用模式匹配和守卫来编写if-else-chain几乎相同的方式:
scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> def f[A : TypeTag] = typeOf[A] match {
case t if t =:= typeOf[Int] => 1
case t if t =:= typeOf[Long] => 2
case _ => 0
}
f: [A](implicit evidence$1: reflect.runtime.universe.TypeTag[A])Int
scala> f[Int]
res5: Int = 1
scala> f[String]
res6: Int = 0
但是,由于此故障单,您的问题中显示的case tpe[Int] =>
之类的构造是不可能的:SI-884 - 它只是一个未实现的功能。