Что такое "ранний инициализатор" в Scala?



У Мартина Одерского недавний пост об уровнях способностей программиста в Scala, в экспертный конструктор библиотек, Он включает в себя термин "в начале инициализаторы".



Они не упоминаются в программирование в Scala. Что это такое?

523   3  

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

    Ничего не найдено.