2012-10-04 5 views
1

Est-il possible d'utiliser une instance Type comme type Scala normal? Par exemple, dans l'extrait suivant, peut-on trouver pi en utilisant tpe?Recherche d'une instance de type

import scala.reflect.runtime.universe._ 

implicit val pi: Double = 3.14159265 
val tpe = typeOf[Double] 
implicitly[Double] // pi 
implicitly[tpe]??? 

Je crains qu'il n'y ait pas une solution facile à atteindre mon objectif, et que je vais avoir besoin d'une sorte d'usine à traduire tpe en implicitement [Double]. Quoi qu'il en soit, je pense qu'intégrer des types de réflexion dans le code Scala pourrait être très puissant, et donc, pas aussi fou que cela puisse paraître.

Répondre

1

Je ne vois pas comment cela aurait beaucoup de sens.

Parlons simplement de ce que cela pourrait signifier pour implicitly. Il est supposé échouer à compiler s'il n'y a pas de telle implicite, ou plus d'une éligibilité. Mais comme le type réel représenté par tpe n'est pas connu avant l'exécution, le fait que implicitly fonctionne avec une instance de type rendrait impossible toute émission d'erreur de compilation. Le mieux que vous puissiez faire est de faire en sorte que tout appel à implicitly compile toujours, que le compilateur stocke quelque part une liste de toutes les valeurs implicites dans la portée (pour tout type), et à la recherche dans cette liste et lève une exception correspond au type représenté par tpe (ou s'il y en a plusieurs). Cela ne pourrait avoir un sens que si nous parlons d'une implémentation alternative de implicitly, disons dynamicImplicitly. Notez que cela nécessiterait le support explicite du compilateur (pour capturer tous les implicits dans la portée à chaque appel à dynamicImplicitly, ce qui ne serait donc pas une simple fonction), et être très inefficace en termes d'espace (comment Beaucoup d'implicits peuvent être dans la portée à un point donné? Oui, beaucoup, et ils auraient tous besoin d'être référencé en quelque sorte dans le bytecode à chaque appel à dynamicImplicitly).

Donc, ma réponse courte est: ne retenez pas votre souffle pour cette fonctionnalité à mettre en œuvre de sitôt. Techniquement, il pourrait être possible d'implémenter dynamicImplicitly en tant que macro scala (à condition qu'il soit possible d'obtenir tous les implicits dans la portée des macros scala, dont je ne suis même pas sûr)

+0

Dans le contexte macro, vous avez accès à tous les implicits dans la portée où la macro va être désolé, en utilisant les méthodes 'ctx.inferImplicit *'. Je les ai utilisés dans plusieurs macros, et ils fonctionnent très bien, mais je n'ai pas pensé à utiliser cette fonctionnalité pour résoudre ce problème. Demain, je vais essayer, parce que ça a beaucoup de sens. Je vous remercie! – jeslg

Questions connexes