433 votes

Où Scala chercher implicits ?

Un implicite question pour les nouveaux arrivants à la Scala semble être: d'où vient le compilateur recherchez implicites? Je veux dire implicite parce que la question ne semble jamais être pleinement formé, comme si il n'y avait pas de mots pour cela. :-) Par exemple, où les valeurs de integral ci-dessous proviennent de?

scala> import scala.math._
import scala.math._

scala> def foo[T](t: T)(implicit integral: Integral[T]) {println(integral)}
foo: [T](t: T)(implicit integral: scala.math.Integral[T])Unit

scala> foo(0)
scala.math.Numeric$IntIsIntegral$@3dbea611

scala> foo(0L)
scala.math.Numeric$LongIsIntegral$@48c610af

Une autre question qui n'a suivre pour ceux qui décident d'apprendre la réponse à la première question est de savoir comment le compilateur de choisir l'implicite à l'utilisation, dans certaines situations d'ambiguïté apparente (mais que la compilation de toute façon)?

Par exemple, scala.Predef définit deux conversions à partir de la String: l'un à l' WrappedString et un autre pour StringOps. Les deux classes, cependant, de partager un grand nombre de méthodes, alors pourquoi ne pas Scala se plaindre d'ambiguïté quand, par exemple, en appelant map?

Remarque: cette question a été inspiré par cette autre question, dans l'espoir de poser le problème d'une manière plus générale. L'exemple a été copié à partir de là, parce qu'il est mentionné dans la réponse.

24voto

Eugene Yokota Points 43213

Je voulais savoir la primauté de l'implicite paramètre de résolution, et non pas seulement lorsqu'il recherche, j'ai donc écrit un post de blog de revoir implicites sans taxe à l'importation (et implicite paramètre de priorité de nouveau après certains commentaires).

En voici la liste:

  • 1) implicites visible à l'actuel invocation champ d'application par l'intermédiaire de la déclaration, les importations, à l'extérieur de la portée, de l'héritage, objet de package qui sont accessibles sans préfixe.
  • 2) étendue implicite, qui contient toute sorte de compagnon objets et objet de package qui présentent une certaine relation à l'implicite du type où l'on recherche (ex: forfait objet de type, un compagnon, un objet du type lui-même, de son type de constructeur, le cas échéant, de ses paramètres le cas échéant, et aussi de ses supertype et supertraits).

Si à chaque étape, nous trouvons plus d'un implicite, statique surcharge règle est utilisée pour le résoudre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X