Этот простой тест, конечно, работает как положено:
scala> var b = 2
b: Int = 2
scala> b += 1
scala> b
res3: Int = 3
Теперь я ввожу это в сферу:
class A(var x: Int) { def +=(y:Int) { this.x += y } }
implicit def int2A(i:Int) : A = new A(i)
Я определяю новый класс и операцию + = с ним, а также удобное неявное преобразование для тех случаев, когда я хочу добавить Int к значению Int Int.
Я никогда не ожидал, что это повлияет на поведение моих обычных операций Int, когда класс «A» совсем не является частью выражения.
Но это так:
scala> var b:Int = 0
b: Int = 0
scala> b += 1
scala> b
res29: Int = 0
scala> b += 2
scala> b
res31: Int = 0
Похоже, что здесь происходит то, что b: Int неявно преобразуется в «A», которое не связано с какой-либо переменной, и затем + + вызывается для него, отбрасывая результаты.
Кажется, что Scala придает первостепенное значение неявному преобразованию над естественным поведением + = (магия компилятора, а не фактический метод), которое уже определено для Ints. Здравый смысл, а также фон C ++ говорят мне, что последствия должны вызываться только в крайнем случае, когда в противном случае компиляция не удалась бы. Это приводит к нескольким вопросам ...
- Почему? Это ошибка? Это по замыслу?
- Есть ли обходной путь (кроме использования "+ =" для моей операции DSL "+ =")?
Спасибо