Смущает оператор определения Int в Scala - PullRequest
20 голосов
/ 07 января 2012

В руководстве по scala говорится, что операция добавления Int на самом деле является вызовом метода: 1+1 означает 1.+(1)

Но когда я просматриваю исходный код Int.scala, кажется, что метод просто выведет сообщение об ошибке. Может ли кто-нибудь объяснить мне, как это работает?

 def +(x: Int): Int = sys.error("stub")

Ответы [ 3 ]

25 голосов
/ 07 января 2012

Int - это класс значений , который несколько отличается от других классов. Невозможно выразить примитивное сложение в scala без получения рекурсивного определения. Например, если определение + было,

def +(x: Int): Int = this + x

Тогда вызов + вызовет +, который вызовет + который ...

Scala необходимо скомпилировать методы классов значений в байтовые коды java для сложения / вычитания / и т.д.

Компилятор выполняет компиляцию + в байт-код java для добавления, но авторы библиотеки scala написали Int.scala с методами-заглушками, чтобы сделать его допустимым исходным файлом scala. Эти методы-заглушки никогда не вызываются.

7 голосов
/ 07 января 2012

Важно понимать, что операторы - это методы в зависимости от того, как человек взаимодействует с языком. Такие вещи, как + на Int, действуют как любой другой метод в Scala, вместо того, чтобы играть по своим собственным правилам.

Однако на уровне реализации они вообще не являются методами: для JVM только классы имеют методы, а подклассы AnyVal не являются классами в отношении JVM. Неудивительно, что на уровне реализации они действуют в основном как примитивы Java.

7 голосов
/ 07 января 2012

Как говорится в реализации, этот метод является заглушкой. По-видимому, его реализация обеспечивается компилятором Scala при компиляции кода, поскольку int + int является примитивной операцией, а сам язык Scala не имеет примитивов - только примитивам JVM известен только компилятор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...