Мне нравится Крейг * ответ , но я думаю, что смысл должен быть более решительным.
Нет никаких "примитивов" - если Int
может это сделать, то может сделать и пользовательский Complex
(например).
Базовое использование ++
будет выглядеть так:
var x = 1 // or Complex(1, 0)
x++
Как реализовать ++
в классе Complex
? Если предположить, что, как и Int
, объект является неизменным, то метод ++
должен вернуть новый объект, но этому новому объекту должно быть присвоено .
Для этого потребуется новая языковая функция. Например, допустим, мы создали ключевое слово assign
. Сигнатура типа также должна быть изменена, чтобы указать, что ++
не возвращает Complex
, а присваивает любому полю, содержащему текущий объект. В духе Scala - не вмешиваться в пространство имен программистов, скажем, мы делаем это, добавляя префикс типа к @
.
Тогда это может быть так:
case class Complex(real: Double = 0, imaginary: Double = 0) {
def ++: @Complex = {
assign copy(real = real + 1)
// instead of return copy(real = real + 1)
}
Следующая проблема заключается в том, что постфиксные операторы сосут с правилами Scala. Например:
def inc(x: Int) = {
x++
x
}
Из-за правил Scala это то же самое, что и:
def inc(x: Int) = { x ++ x }
Что не было целью. Теперь Scala предпочитает плавный стиль: obj method param method param method param ...
. Это хорошо сочетает традиционный синтаксис C ++ / Java object method parameter
с концепцией функционального программирования, заключающейся в конвейерной обработке ввода через несколько функций для получения конечного результата. Этот стиль также недавно назывался «плавными интерфейсами».
Проблема в том, что, предоставляя привилегию этому стилю, он наносит вред постфиксным операторам (и префиксным, но в любом случае Scala их почти не имеет). Итак, в конце концов, Scala придется внести большие изменения, и в любом случае он сможет измерить элегантность операторов приращения и убывания C / Java - если только он действительно не отклоняется от того, что делает поддержка.