es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Distinga los Enum de Scala-3 de los Traits Sellados.

¿Es posible distinguir entre las enum de Scala-3 y los traits sellados utilizando Mirrors o incluso Macros?

definir transparent inline def isScalaEnum[A]: Boolean = ${ isScalaEnumImpl[A] }
privado def isScalaEnumImpl[A: Type](using q: Quotes): Expr[Boolean] = ???

Por ejemplo, ¿cómo se implementa el macro anterior?

sealed trait T
case class A(x: Int) extends T
case class B(x: String) extends T

enum Color(val rgb: Int):
  case Red   extends Color(1)
  case Green extends Color(2)

isScalaEnum[T]     debería ser falso
isScalaEnum[Color] debería ser verdadero 
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La implementación de la macro isScalaEnum podría ser algo como esto:

    import scala.quoted._
    
    inline def transparente esScalaEnum[A]: Boolean = ${ isScalaEnumImpl[A] }
    
    private def isScalaEnumImpl[A: Type](using q: Quotes): Expr[Boolean] = {
      import q.reflect._
      val sym = Type.of[A].typeSymbol
      if (sym.isClassDef && sym.is(Flags.Enum)) Expr(true)
      else Expr(false)
    }
    

Comments are closed.