2010-03-10 17 views

Antwort

18

Implizite Funktionen eines Argument verwendet werden, um automatisch Werte zu einem erwarteten Typ zu umwandeln. Diese werden als Implizite Ansichten bezeichnet. Mit zwei Argumenten funktioniert es nicht oder ergibt keinen Sinn.

Sie könnten einen impliziten Hinblick auf ein TupleN gelten:

implicit def intsToString(xy: (Int, Int)) = "test" 
val s: String = (1, 2) 

Sie können die letzte Parameterliste einer Funktion als implizit auch markieren.

def intsToString(implicit x: Int, y: Int) = "test" 
implicit val i = 0 
val s: String = intsToString 

Oder diese beiden Verwendungen von implicit Kombination:

implicit def intsToString(implicit x: Int, y: Int) = "test" 
implicit val i = 0 
val s: String = implicitly[String] 

jedoch in diesem Fall nicht wirklich nützlich ist.

UPDATE

auf Martins Kommentar zu erarbeiten, ist dies möglich.

implicit def foo(a: Int, b: Int) = 0 
// ETA expansion results in: 
// implicit val fooFunction: (Int, Int) => Int = (a, b) => foo(a, b) 

implicitly[(Int, Int) => Int] 
+0

Haben Sie (:-)), dass meine ursprüngliche def implizieren (was nicht haben implizite Parameterliste) kann nicht implizit aufgerufen werden? (Das würde bedeuten, dass das "implizite" Schlüsselwort in meinem Beispiel völlig bedeutungslos ist - wenn kein Code jemals einen Unterschied beobachten könnte). Ist das wirklich so? Oder soll das eine Teilantwort sein, im Sinne von "Hey, zumindest funktionieren diese Fälle?" –

+1

Korrigieren. Ich kenne den bekannten Weg in der aktuellen Sprache, dass dies aufgerufen werden könnte. Eine Compiler-Warnung könnte hilfreich sein, um diese Tatsache zu kommunizieren. – retronym

+7

Die ursprüngliche Funktion kann nicht als implizite Konvertierung verwendet werden, da sie zwei Parameter benötigt. Es kann jedoch immer noch als implizites Argument für eine andere Methode verwendet werden. Der "implizite" Modifikator hat hier also eine nützliche Bedeutung. –

4

Jasons Antwort verfehlt einen sehr wichtigen Fall aus: eine implizite Funktion mit mehreren Argumenten, wo alle, aber die ersten implizit sind ... diese zwei Parameterlisten erfordert, aber das scheint nicht gegeben den Gültigkeitsbereich zu sein die Art, wie die Frage geäußert wurde.

Hier ist ein Beispiel für eine implizite Konvertierung, die

zwei Argumente nimmt
case class Foo(s : String) 
case class Bar(i : Int) 

implicit val defaultBar = Bar(23) 

implicit def fooIsInt(f : Foo)(implicit b : Bar) = f.s.length+b.i 

Probe REPL Sitzung

scala> case class Foo(s : String) 
defined class Foo 

scala> case class Bar(i : Int) 
defined class Bar 

scala> implicit val defaultBar = Bar(23) 
defaultBar: Bar = Bar(23) 

scala> implicit def fooIsInt(f : Foo)(implicit b : Bar) = f.s.length+b.i 
fooIsInt: (f: Foo)(implicit b: Bar)Int 

scala> val i : Int = Foo("wibble") 
i: Int = 29 
Verwandte Themen