Смущенный операторными определениями Int в Scala
В учебнике scala говорится, что операция Int
add на самом деле является вызовом метода: 1+1
означает 1.+(1)
Но когда я смотрю в исходный код Int.scala
, кажется, что метод просто выведет сообщение об ошибке. Может ли кто-нибудь объяснить мне, как это работает?
def +(x: Int): Int = sys.error("stub")
Ответы
Ответ 1
Int - это класс value, который несколько отличается от других классов. Невозможно выразить примитивное дополнение в scala, не попадая в рекурсивное определение. Например, если определение + было,
def +(x: Int): Int = this + x
Тогда вызов + вызовет +, который будет вызывать +, который...
Scala необходимо скомпилировать методы классов значений в java-байтовые коды для сложения/вычитания/etc.
Компилятор компилирует + в байт-код java для добавления, но авторы библиотеки scala написали Int.scala с методами stub, чтобы сделать его допустимым исходным файлом scala. Эти методы заглушки никогда не вызываются.
Ответ 2
Как говорит реализация, этот метод является заглушкой. По-видимому, его реализация обеспечивается компилятором Scala при компиляции кода, поскольку int + int
является примитивной операцией, а язык Scala сам по себе не имеет примитивов - только компилятор знает о примитивах на JVM.
Ответ 3
Важно понимать, что операторы - это методы как вопрос взаимодействия человека с языком. Такие вещи, как +
on Int
, действуют как любой другой метод в Scala, вместо того, чтобы быть тем, что играет по их собственным правилам.
Однако на уровне реализации они вообще не являются методами: для JVM только классы имеют методы, а подклассы AnyVal
не являются классами JVM. Неудивительно, что на уровне реализации они действуют в основном как Java-примитивы.