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 に答える