433 Stimmen

Wo sucht Scala nach Implikaten?

Eine implizit Frage an Scala-Neulinge scheint zu sein: Wo sucht der Compiler nach Implikaten? Ich spreche von implizit, weil die Frage anscheinend nie vollständig gestellt wird, als ob es keine Worte dafür gäbe :-) Zum Beispiel, wo werden die Werte für integral von unten kommen?

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

Eine weitere Frage, die sich denjenigen stellt, die sich entschließen, die Antwort auf die erste Frage zu lernen, ist, wie der Compiler in bestimmten Situationen, in denen er offensichtlich nicht eindeutig ist (die aber trotzdem kompiliert werden), entscheidet, welche implizite Sprache er verwendet.

Zum Beispiel, scala.Predef definiert zwei Konvertierungen von String : eine bis WrappedString und eine weitere an StringOps . Beide Klassen teilen sich jedoch eine Menge Methoden, warum beschwert sich Scala also nicht über die Mehrdeutigkeit, wenn man z.B. map ?

Note : Diese Frage wurde inspiriert durch diese andere Frage in der Hoffnung, das Problem auf eine allgemeinere Weise zu formulieren. Das Beispiel wurde von dort kopiert, weil es in der Antwort erwähnt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X