4

我有一种resultType. Context.this.type#c#universe#Type我需要将它与Unit类型相匹配。我试过

resultType match {
  case q"Unit" => ...
}

但我想这Unit只是一个明显不匹配的字符串文字。如何通过 quasiqotes 匹配类型?

我也试过

resultType match {
  case TypeRef(ThisType(_), Symbol("scala.Unit"), _) => ...
}

但有一个错误:

[error]  pattern type is incompatible with expected type;
[error]  found   : Symbol
[error]  required: Context.this.c.universe.SymbolContextApi

如何以这种方式匹配类型?

4

3 回答 3

7

在这种情况下,quasiquotes 不起作用的主要原因是您不匹配 aTree而是匹配 a Type。这两个是反射 API 的独立概念,并不完全相同。

检查类型是否与您期望的相同的一种简单方法是使用typeOf并键入相等运算符=:=

case tpe if tpe =:= typeOf[Unit] =>

当然,这不是唯一的方法。TypeRef如其他答案所示,还可以匹配并检查其中的符号是否相等。

于 2015-06-25T09:46:12.880 回答
3

您的答案的变体,如果更好,则值得商榷:

case TypeRef(_, sym, _) if sum == typeOf[Unit].typeSymbol => ...
于 2015-06-23T02:20:59.990 回答
-1

唉,我发现没有比这更聪明的了:

case TypeRef(_, sym, _) if sym.fullName == "scala.Unit" => ...
于 2013-09-13T11:16:57.110 回答