Что такое «ранний инициализатор» в Scala? - PullRequest
63 голосов
/ 17 января 2011

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

Они не упомянуты в Программирование в Scala .Что они?

Ответы [ 3 ]

100 голосов
/ 17 января 2011

Ранние инициализаторы являются частью конструктора подкласса, который предназначен для запуска перед его суперклассом.Например:

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 в обычном порядке инициализации (суперкласс перед классом).

2 голосов
/ 15 октября 2012

Насколько я могу судить, мотивация (как указано в ссылке выше):

"Естественно, когда val переопределяется, он не инициализируется более одного раза. Поэтому, хотя x2 в приведенном выше примере, по-видимому, определяется в каждой точке, это не тот случай: переопределенный val при создании будет выглядеть нулевым суперклассов, как и абстрактное значение. "

Я не понимаю, почему это вообще естественно. Вполне возможно, что р.ч.с. присваивания может иметь побочный эффект. Обратите внимание, что такая структура кода совершенно невозможна ни в C ++, ни в Java (и я предполагаю Smalltalk, хотя я не могу говорить за этот язык). Фактически вы должны делать такие двойные присваивания неявными ... ticilpmi ... EXplicit в этих языках через конструкторы. В свете р.ч.с. неопределенность побочных эффектов, это действительно не кажется большой мотивацией: способность обходить побочные эффекты суперкласса (таким образом аннулируя инварианты суперкласса) через НАЗНАЧЕНИЕ? Ик!

Существуют ли другие "убийственные" мотивы для разрешения такой небезопасной структуры кода? Объектно-ориентированные языки обходились без такого механизма около 40 лет (30 с лишним лет, если считать с момента создания языка), зачем включать его сейчас?

Это ... просто ... кажется ... опасно.

1 голос
/ 20 ноября 2013

Если подумать, годовой слой ...

Это всего лишь торт.Буквально.

Не рано НИЧЕГО.Просто торт (mixins).

Торт - это термин / паттерн, придуманный самим Гранд-Пухом, который использует систему черт Scala, которая находится на полпути между классом и интерфейсом.Это гораздо лучше, чем шаблон оформления Java.

Так называемый «интерфейс» - это просто неназванный базовый класс, и то, что раньше было базовым классом, действует как черта (чего я, честно говоря, не зналбыть сделано).Мне неясно, может ли класс with'd принимать аргументы (черты не могут), попробует и отчитается.

Этот вопрос и его ответ вошли в одну из самых крутых функций Scala.Читайте об этом и будьте в восторге.

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