Comment fonctionne le cas par type en Scala ?
-
26-12-2019 - |
Question
Je connais les classes de cas, la correspondance de modèles, l'annulation d'application et PartialFunction, mais je suis confus au sujet de l'extrait de macros ci-dessous.
val declarations = weakTypeOf[T].declarations
val methods = declarations.collect { case m: MethodSymbol => m }
Scaladoc de MemberScopehttp://www.scala-lang.org/api/2.10.4/#scala.reflect.api.Scopes$MembreScope
La méthode de collecte accepte PartialFunction[Universe.Symbol, B]
je ne trouve pas unapply
méthode de MethodSymbol
et ce n'est pas non plus une classe de cas, donc dans le compilateur de code de sorcière, les transformations
{ case m: MethodSymbol => m }
La solution
Parce que MethodSymbol
n'est pas un type générique, la correspondance
case m: MethodSymbol => m
est essentiellement équivalent à
case m if m.isInstanceOf[MethodSymbol] => m
Il n'y a absolument aucune magie ici, et unapply
les machines ne sont pas du tout liées à de tels matchs.La même chose peut facilement être faite même en Java.