Dieser einfache Test, natürlich, wie erwartet funktioniert:Scala räumt der impliziten Konvertierung Vorrang vor "natürlichen" Operationen ein ... Warum? Ist das ein Fehler? Oder mache ich etwas falsch?
scala> var b = 2 b: Int = 2 scala> b += 1 scala> b res3: Int = 3
Nun ist diese in Umfang Ich bringe:
class A(var x: Int) { def +=(y:Int) { this.x += y } } implicit def int2A(i:Int) : A = new A(i)
Ich bin eine neue Klasse definiert und einen + = Betrieb auf, und eine bequeme implizite Konvertierung für die Zeiten, wenn ich Int Int Int einen Int-Wert hinzufügen möchte.
Ich hätte nie erwartet, dass dies die Art beeinflussen würde, wie sich meine regulären Int-Operationen verhalten, wenn die Klasse "A" überhaupt nicht Teil des Ausdrucks ist.
Aber es tut:
scala> var b:Int = 0 b: Int = 0 scala> b += 1 scala> b res29: Int = 0 scala> b += 2 scala> b res31: Int = 0
Was hier zu sein scheint passiert ist, dass die b: Int implizit zu einem „A“ umgewandelt, die nicht an eine Variable gebunden ist, und dann + = aufgerufen wird darauf, die Ergebnisse verwerfen.
Scala scheint der impliziten Umwandlung gegenüber dem natürlichen + = - Verhalten (Compiler-Magie, keine tatsächliche Methode), die bereits für Ints definiert ist, eine hohe Priorität zu geben. Common-sense sowie ein C++ - Hintergrund sagt mir, dass implicits nur als letzter Ausweg aufgerufen werden sollte, wenn die Kompilierung sonst fehlschlagen würde. Das führt zu mehreren Fragen ...
- Warum? Ist das ein Fehler? Ist es von Entwurf?
- Gibt es einen Workaround (außer nicht mit "+ =" für meine DSL "+ =" Operation)?
Dank
'scala -Xprint: typer' sagt mir, dass es genau das tut, was Sie sagten, es tut - mit einer impliziten Umwandlung, so dass es' + = 'aufrufen konnte. –