如何通过q​​uasiquotes或deconstructors匹配`universe#Type`?

Ale*_*sev 4 scala scala-macros scala-quasiquotes

我有一个类型resultTypeContext.this.type#c#universe#Type.我需要将它与Unit类型相匹配.我试过了

resultType match {
  case q"Unit" => ...
}
Run Code Online (Sandbox Code Playgroud)

但我想这Unit只是一个字符串文字,显然不匹配.如何通过q​​uasiqotes匹配类型?

我也尝试过

resultType match {
  case TypeRef(ThisType(_), Symbol("scala.Unit"), _) => ...
}
Run Code Online (Sandbox Code Playgroud)

但有一个错误:

[error]  pattern type is incompatible with expected type;
[error]  found   : Symbol
[error]  required: Context.this.c.universe.SymbolContextApi
Run Code Online (Sandbox Code Playgroud)

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

Den*_*lin 7

Quasiquotes在这种情况下不起作用的主要原因是你不匹配a Tree而不是a Type.这两个是反射API的单独概念,它们并不完全相同.

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

case tpe if tpe =:= typeOf[Unit] =>
Run Code Online (Sandbox Code Playgroud)

当然,这不是唯一的方法.TypeRef如同其他答案所示,还可以匹配并检查其内部符号的相等性.