2016-04-09 7 views
-2

Gibt es eine Beziehung zwischen impliziten Konvertierungen und impliziten Parametern in Scala?Wie ist die Beziehung zwischen impliziten Konvertierungen und impliziten Parametern in Scala?

Ich habe kein Interesse was auch immer zu wissen, was die verschiedenen Arten von Implikationen sind oder was ihre Auflösungsregeln sind.

Ich bin nur daran interessiert, warum diese beiden Konzepte den gleichen Namen haben.

+3

Dies beantwortet die Frage: http://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits –

+0

@GiovanniCaporaletti Wie beantwortet das die Frage? –

+0

@MichaelLafayette Es wird im Detail erklärt, was eine implizite Konvertierung und ein impliziter Parameter sind und wie sie vom Compiler verwaltet werden. Ich weiß ehrlich nicht, was ich noch hinzufügen könnte. Es fügt auch alles in Zusammenhang mit Ansichtsgrenzen und Kontextgrenzen, es ist eine umfassende Antwort. –

Antwort

3

AFAIK gibt es keine unmittelbare Beziehung ist, außer daß sie das gleiche Schlüsselwort teilen.

Aber sie können auf eine interessante Weise kombiniert werden, wie:

class Foo 
class Bar 
class FooBar(foo: Foo, bar: Bar) 

implicit val foo = new Foo 
implicit val bar = new Bar 

implicit def fooBar(implicit foo: Foo, bar: Bar): FooBar = new FooBar(foo, bar) 

implicitly[FooBar] 

implicit conversion (ausgefallener Name, aber eigentlich nichts anderes als eine implizite, die Parameter akzeptiert) implicit parameters akzeptieren kann so ziemlich wie ein implicit val (gegeben zu handeln implicits sind definiert). Boom.

3

Eine implizite Umwandlung vom Typ AB ist eine implizite Funktion A => B einzugeben.

Eine implizite def macht eine implizite Funktion zur Verfügung:

// two types 
class A 
class B 
// implicit conversion from A to B 
implicit def aToB(a: A): B = { 
    println("aToB"); 
    new B 
} 
// we now have a Function[A, B] aka A => B in the implicit scope 
val f = implicitly[A => B] 
f(new A) 
> aToB 
res1: B = [email protected] 

Eine implizite Funktion ermöglicht implizite Konvertierungen:

class IntExtension(x: Int) { def isPositive = x > 0 } 
implicit val intToIntExtensions: Int => IntExtension = x => new IntExtension(x) 
> 1.isPositive 
res2: Boolean = true 
+0

Lass mich sehen, ob ich dich richtig verstehe. implizit [A => B] gibt einen Verweis auf aToB zurück. Sie können dieser Referenz ein neues A geben und es wird ein neues B zurückgeben. Das implizite val erfüllt dieselbe Funktion wie ein implizites def. Aber was ist mit einer Funktion mit impliziten Parametern wie foo (int: Int) (impliziter Balken: Balken)? –

Verwandte Themen