2013-06-24 2 views
0

Это скорее гипотетический вопрос, но, допустим, я бы хотел изменить поведение + (или любого другого арифметического оператора) на Int в рамках области, что-то вроде этого (я знаю, что это что-то сумасшедшее и что-то такое, d стараются избегать вообще, но я считаю, это интересно):Можно ли переопределить встроенные операторы в Scala?

object MySillyStuff extends App { 
    def +(a: Int, b: Int) = a*b; 

    println(1+2) 
} 

возможно ли это так, или я только способен перегружать операторы через неявные преобразования с новым типом? (I.e., я должен явно создать 1 как член этого нового типа и использовать неявное преобразование 2 для этого конкретного типа).

ответ

4

Обратите внимание, что в scala нет операторов. В вопросе + приведен метод Int: (1).+(2).

Единственный способ переопределить существующий метод - наследование с ключевым словом override.

Неявный класс позволяет вам добавить новый метод, но не переопределять метод, который уже существует.

Вы можете обернуть класс без накладных расходов, используя value classes вроде этого:

case class StrangeInt(val i: Int) extends AnyVal { 
    def +(that: Int): StrangeInt = StrangeInt(i*that) 
} 

val i = StrangeInt(3) 
println(i+3) 
// StrangeInt(9) 
+0

Ok, так что в основном я не могу этого сделать. Мысль о том, что есть кое-какие взломы, хотя через переопределение вещей в «Predef» или что-то, но не видели никаких операторов там. Thx для разъяснения, сения! – rlegendi

+0

@rlegendi: в scala нет операторов. '+' - это метод 'Int':' (1). + (2) '. Он не имеет ничего с 'Predef'. – senia

+2

Можете ли вы доказать в своем примере, что умножение произошло вместо добавления? ;-) –

Смежные вопросы