2

是否已经有一种模式匹配替代方法来编写冗长的测试,例如

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
  ...
}

为此编写一个提取器看起来很容易,但我想知道是否还没有这样的东西。

4

2 回答 2

2

到目前为止,我在普通代码中所做的是物化类型。我想它也可以在宏中使用:

val ClassOfInt = classOf[Int]
val ClassOfLong = classOf[Long]

aTpe match {
   case ClassOfInt => 1
   case ClassOfLong => 2
}

它有效,但我非常想知道是否有一种“更简洁”的方式。

于 2013-09-30T22:25:13.133 回答
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 - 它只是一个未实现的功能。

于 2013-10-01T12:45:40.847 回答