2016-04-29 2 views
3

Is + = (или любые операторы присваивания) метод в scala для типа Int.Где + = метод, расположенный для int в scala

Например,

var x=5 
x+=1 

Здесь я могу использовать + = метод только тогда, когда она является переменной.

Я не в состоянии сделать,

5+=1 

ли компилятор Scala считает этот метод как частный случай?

Почему он недоступен в классе scala.Int?

+0

Что вы ожидаете от '5 + = 1' на самом деле? Я не знаю Scala, но я не вижу причин, позволяющих вам перезаписать значение примитива ... – CptBartender

+0

Я думал, что в scala (только методы) нет оператора, поэтому не будет никакой разницы между значение и переменная. – MinusInfinity

+0

5. + (1) и x. + (1) будут работать последовательно, поэтому я ожидаю, что этот оператор будет вести себя одинаково. – MinusInfinity

ответ

10

Метод +=, он компилируется до x = x + 1. Это подробно описано в specification:

6.12.4 Операторы присваивания

Рассмотрим оператор присваивания, такие как + = в операции инфиксной л + = г, где L, R

- выражения. Эта операция может быть повторно интерпретировать как операцию , которая соответствует заданию

l = l + r 

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

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

  1. Левая сторона л не имеет член с именем + =, а также не могут быть преобразованы с помощью неявного преобразования в значение с членом с именем + =.

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

+0

Итак, вы можете сделать это для любого метода, который удовлетворяет условию? Например. 'obj1 concat = obj2'? –

+0

@ LukaJacobowitz - Не думаю, что это относится только к операторам, которые являются лексически непустыми последовательностями символов оператора. Раздел [лексический синтаксис] (http://www.scala-lang.org/files/archive/spec/2.11/01-lexical-syntax.html) определяет символы оператора как печатные символы ascii, которые не являются пробелами, буквами, цифрами , скобки или разделители. – Lee

+0

Удивительный, спасибо за понимание! –