2016-06-26 1 views
3

Я читаю Программирование в Scala М. Одерского, и теперь я пытаюсь понять смысл операторов. Насколько я могу судить, любой оператор в Scala - это всего лишь метод. Рассмотрим следующий пример:+ = оператор в Scala

class OperatorTest(var a : Int) { 

    def +(ot: OperatorTest): OperatorTest = { 
    val retVal = OperatorTest(0); 
    retVal.a = a + ot.a; 
    println("=") 
    return retVal; 
    } 
} 

object OperatorTest { 
    def apply(a: Int) = new OperatorTest(a); 
} 

В этом случае мы имеем только оператор +, определенный в этом классе. И если мы вводим что-то вроде этого:

var ot = OperatorTest(10); 
var ot2 = OperatorTest(20); 
ot += ot2; 
println(ot.a); 

затем

=+ 
30 

будет выход. Поэтому я бы предположил, что для каждого класса (или типа?) В Scala у нас есть оператор +=, определенный для него, как a += b iff a = a + b. Но так как каждый оператор является всего лишь методом, где задан оператор + =? Может быть, есть некоторый класс (например, Object в Java), содержащий все ограничения для таких операторов и так далее.

Я смотрел на AnyRef в надежде найти, но не смог.

ответ

7

+= и аналогичные операторы освобождаются компилятором в случае, если определено + и не определено +=. (Точно так же работает и для других операторов тоже.) Проверьте Спецификация языка в Scala (6.12.4):

операторы присваивания обрабатывается специальным образом в том, что они могут быть расширены к уступкам, если никакая другая интерпретация не является действительным.

Рассмотрим оператор присваивания, такой как + = в операции инфикса l + = r, где l, r - выражения. Эта операция может быть повторно интерпретирована как операция, которая соответствует назначению

l = l + r, за исключением того, что левая сторона операции l оценивается только один раз.

Повторная интерпретация выполняется, если выполнены следующие два условия: .

Левая сторона l не имеет члена с именем + =, а также не может быть преобразован путем неявного преобразования в значение с членом с именем + =. Назначение l = l + r является корректным по типу. В частности, это означает, что l относится к переменной или объекту, который может быть назначен, и который может быть конвертирован в значение с членом с именем +.

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

  • Нет связанных вопросов^_^