首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隐式宏。默认隐式值。多么?

隐式宏。默认隐式值。多么?
EN

Stack Overflow用户
提问于 2020-09-29 22:59:43
回答 1查看 74关注 0票数 0

我甚至不知道该怎么问这个问题。

我有一个为T类型创建IsEnum[T]实例的宏。

我正在对它进行测试,并希望确保不会为未密封的类型找到隐式类型,或者通常不满足枚举的要求。

所以我创建了这个方法来测试

代码语言:javascript
复制
    def enumOf[T](implicit isEnum:IsEnum[T] = null) = isEnum

然后我要确保enumOf[NotAnEnum] == null

但相反,它会在编译时失败。

一件事就是宏的错误。另一件事是宏并不适用于给定的情况。如何在创建宏时进行区分?

编辑:我使用了c.abortc.error,它们给我的结果都是一样的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-30 07:43:33

听起来你没有把你的宏物化类型类设为IsEnum白盒。通常情况下,隐式宏应该是白盒。

代码语言:javascript
复制
import scala.language.experimental.macros
import scala.reflect.macros.whitebox

trait IsEnum[T]
object IsEnum {
  implicit def mkIsEnum[T]: IsEnum[T] = macro mkIsEnumImpl[T]
  def mkIsEnumImpl[T: c.WeakTypeTag](c: whitebox.Context): c.Tree = {
    import c.universe._
    val typ = weakTypeOf[T]
    val classSymbol = typ.typeSymbol.asClass
    if (!classSymbol.isTrait || !classSymbol.isSealed) c.abort(c.enclosingPosition, s"$typ must be sealed trait")
    val symbols = classSymbol.knownDirectSubclasses
    symbols.collectFirst {
      case symbol if !symbol.isModuleClass || !symbol.asClass.isCaseClass =>
        c.abort(c.enclosingPosition, s"${symbol.asClass.toType} must be case object")
    }
    q"new IsEnum[$typ] {}"
  }
}

def enumOf[T](implicit isEnum: IsEnum[T] = null) = isEnum

用法:

代码语言:javascript
复制
sealed trait A
object A {
  case object B extends A
  case object C extends A
  case class D() extends A
}
enumOf[A] //null

sealed trait A
object A {
  case object B extends A
  case object C extends A
  class D extends A
}
enumOf[A] //null

sealed trait A
object A {
  case object B extends A
  object C extends A
}
enumOf[A] //null

trait A
object A {
  case object B extends A
  case object C extends A
}
enumOf[A] //null

sealed trait A
object A {
  case object B extends A
  case object C extends A
}
enumOf[A] //App$$anon$1@47f37ef1

宏的运行时是主代码的编译时间。如果一个黑箱宏(甚至是隐式的黑箱宏)抛出一个异常,那么在主代码编译期间它将是一个编译错误。如果白盒隐式宏抛出异常,那么在主代码编译期间,隐式宏将从候选代码中悄悄删除。

https://docs.scala-lang.org/overviews/macros/blackbox-whitebox.html

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64122310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档