Что такое "ранний инициализатор" в Scala?
У Мартина Одерского недавний пост об уровнях способностей программиста в Scala, в экспертный конструктор библиотек, Он включает в себя термин "в начале инициализаторы".
Они не упоминаются в программирование в Scala. Что это такое?
3 ответов:
ранние инициализаторы являются частью конструктора подкласса, который предназначен для запуска перед его суперклассом. Например:
abstract class X { val name: String val size = name.size } class Y extends { val name = "class Y" } with Xесли код был записан как
class Z extends X { val name = "class Z" }тогда исключение нулевого указателя произойдет, когда
Zполучил инициализацию, потому чтоsizeинициализируется передnameв обычном порядке инициализации (суперкласс перед классом).
насколько я могу судить, мотивация (как указано в ссылке выше):
"естественно, когда val переопределяется, он не инициализируется более одного раза. Поэтому, хотя x2 в приведенном выше примере, по-видимому, определяется в каждой точке, это не так: переопределенный val будет казаться нулевым во время построения суперклассов, как и абстрактный val."
Я не понимаю, почему это вообще естественно. Вполне возможно, что r.h. s. назначения может есть побочный эффект. Обратите внимание, что такая структура кода совершенно невозможна ни в C++, ни в Java (и я угадаю Smalltalk, хотя я не могу говорить на этом языке). На самом деле вы должны сделать такие двойные назначения неявными...тицилпми...Явно в этих языках с помощью конструкторов. В свете неопределенности побочных эффектов r.h.s. это действительно не похоже на большую мотивацию вообще: способность обходить побочные эффекты суперкласса (тем самым опустошая инварианты суперкласса) через назначение? Крик!
существуют ли другие" убийственные " мотивы для разрешения такой небезопасной структуры кода? Объектно-ориентированные языки обходились без такого механизма около 40 лет (30 с лишним лет, если считать с момента создания языка), зачем включать его сейчас?
его...просто...кажется...опасный.
на второй мысли, годичный слой...
Это просто торт. Буквально.
не раннее ничего. Просто торт (миксины).
Cake-это термин / шаблон, придуманный самим Grand Pooh-bah, который использует систему признаков Scala, которая находится на полпути между классом и интерфейсом. Это намного лучше, чем узор украшения Java.
Так называемый "интерфейс" - это просто безымянный базовый класс, и то, что раньше было базовым классом, действует как черта (которую я, честно говоря, не знал, что можно сделать). Мне непонятно, может ли класс "с'D" принимать аргументы (черты не могут), попробует его и отчитается.
этот вопрос и его ответ вошли в одну из самых крутых функций Scala. Читайте об этом и будьте в восторге.
Comments