如何在 return 匹配模式的准引用中使用 cq

How to use cq in quasi quote to return the matched pattern

我正在尝试编写这个 case authorDao: AuthorDao => authorDao 以便它 returns 成为 Dao 本身的子类。

当我使用这个准引用时:

val daoType = TypeName(daoName)
val caseTerm = TermName(daoName.toLowerCase)

cases.append(cq"$caseTerm: $daoType=> $caseTerm")

它生成这个

case (authordao @ ((_): AuthorDao)) => authordao

如果我这样做

cases.append(cq"${q"$caseTerm: $daoType"} => $caseTerm")

这样做

case ((authordao): AuthorDao) => authordao

两者都会产生编译错误

谷歌搜索后,我在这里找到了答案:

Scala multiple type pattern matching

基本上

case authordao: AuthorDao => authordao 相当于这个

case authordao @ AuthorDao(_) => authordao

所以最后的代码是这样的

      val daoTerm = TermName(daoName)
      val caseType = TypeName(daoName.toLowerCase())
      val caseExpr = TermName(daoName.toLowerCase)

      cases.append(cq"$caseType @ $daoTerm(_) => $caseExpr")