加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何通过q??uasiquotes或deconstructors匹配`universe#

发布时间:2020-12-16 09:50:06 所属栏目:安全 来源:网络整理
导读:我有一个类型resultType的Context.this.type#c#universe #Type.我需要将它与单元类型匹配.我试过了 resultType match { case q"Unit" = ...} 但我想这里的Unit只是一个字符串文字,显然不匹配.如何通过q??uasiqotes匹配类型? 我也尝试过 resultType match {
我有一个类型resultType的Context.this.type#c#universe #Type.我需要将它与单元类型匹配.我试过了

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

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

我也尝试过

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

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

解决方法

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读