Почему существует `ScalaObject`? - PullRequest
       35

Почему существует `ScalaObject`?

10 голосов
/ 26 сентября 2010

Почему все классы Scala наследуются от ScalaObject, хотя эта черта совершенно пуста и не имеет (видимой?) Функциональности по сравнению с AnyRef, который определяет дополнительные методы?

Не будет ли это медленноВызовы метода down, такие как equals() или hashCode(), потому что для этого потребуется учитывать другой класс (который может переопределить методы)?

Разве нельзя складывать AnyRef и ScalaObject в один класс?

ОБНОВЛЕНИЕ: ScalaObject было уничтожено с новой версией Scala для 2.10.

Ответы [ 3 ]

11 голосов
/ 26 сентября 2010

ScalaObject вставляет метод $tag, который, согласно комментарию в исходном коде библиотеки для 2.7 , "необходим для оптимизации выражений сопоставления с образцом, которые соответствуют конструкторам классов случая". Поскольку имя начинается с $, его, конечно, следует считать «скрытым» для разработчиков приложений. В Scala 2.8 он полностью пустой, поэтому я полагаю, что он существует для обратной совместимости.

7 голосов
/ 26 сентября 2010

Диспетчеризация методов не связывает структуру наследования классов в поисках реализаций.Компилятор создает таблицу отправки сетевых методов для каждого класса, которая отражает его чистую переопределенную / унаследованную линию методов.Это одно из достоинств статического разрешения всех типов печати. ​​

4 голосов
/ 26 сентября 2010

Это также делает удобный крюк для статического анализа.Например, представьте, что у вас есть инструмент для поиска в базе кода (скомпилированный или нет), и скажите, что вы можете улучшить некоторую метрику связности / связи / layer-balance / what-have-you, извлекая черту из этихклассы и создавать неявные преобразования для этих классов.Этот инструмент будет разумно сообщать только о признаках, которые могут быть выгодно извлечены из классов, наследующих ScalaObject, в то же время сообщая о прибыльных неявных преобразованиях из любого класса Java.Этот же инструмент будет сообщать о любых возможных «нулевых» возвратах из подклассов ScalaObject (где Option или аналогичные обычно являются лучшим выбором), игнорируя при этом нулевые возвраты из классов Java.

...