2015-08-29 5 views
6

Für implizite Konvertierung in Scala, kann ich entweder implizite KonvertierungsfunktionUnterschied zwischen Konvertierung mit impliziter Funktion und impliziter Klasse in Scala

implicit def intToX(i:Int):X = new X(i) 

1.myMethod // -1 

oder implizite Klasse

implicit class X(i: Int) { 
    def myMethod = - i 
} 

1.myMethod // -1 

Gibt es einen Unterschied zwischen der Verwendung zwei? Wann sollte ich eins vorziehen?

Es gibt eine ähnliche Frage zu implicit conversion vs. type class aber es vergleicht nur implizite Funktionen und Typklassen. Was mich interessiert ist der Unterschied von impliziten Klassen.

Antwort

14

Implicit Klasse ist ein Syntaxzucker für implizites Verfahren und eine Klasse:

http://docs.scala-lang.org/sips/completed/implicit-classes.html:

Zum Beispiel kann eine Definition der Form:

implicit class RichInt(n: Int) extends Ordered[Int] { 
    def min(m: Int): Int = if (n <= m) n else m 
    ... 
} 

wird durch den Compiler wie folgt transformiert werden:

class RichInt(n: Int) extends Ordered[Int] { 
    def min(m: Int): Int = if (n <= m) n else m 
    ... 
} 

implicit final def RichInt(n: Int): RichInt = new RichInt(n) 

Implicit Klassen wurden in scala 2.10 hinzugefügt, weil es ist sehr häufig neue Klasse mit der Definition implizites Verfahren Umwandlung, um es zu definieren.

Aber wenn Sie nicht brauchen, eine neue Klasse aber definieren implizite Konvertierung in bestehende Klasse zu definieren, sollten Sie besser, eine implizite Methode

+0

Dank verwenden, das ist genau das, was ich wissen wollte! – Mifeet

Verwandte Themen