Вопрос по enums, scala – Понимание перечислений scala
Я должен сказать, что не понимаю перечислимые классы Scala. Я могу скопировать и вставить пример из документации, но я понятия не имею, что происходит.
object WeekDay extends Enumeration {
type WeekDay = Value
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
What means type WeekDay = Value
and why do I have to write that?
Why is val Mon = Value
? What does that even mean?
Why do I have to import the WeekDay
object? And,
when I write val day = WeekDay.Mon
, why is it type WeekDay.Value
, not type WeekDay
?
Enumeration
черта имеет тип членаValue
представление отдельных элементов перечисления (фактически это внутренний класс, но здесь разница не имеет значения).
таким образомobject WeekDay
наследует этот тип члена. Линияtype WeekDay = Value
это простоtype alias, Это полезно, потому что после импорта его в другом месте сimport WeekDay._
Вы можете использовать этот тип, например:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
Вместо этого минимальная версия будет просто:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
а ты нетhave to импортировать содержимоеobject WeekDay
, но тогда вам нужно будет использовать типWeekDay.Value
и для квалификации отдельных членов. Таким образом, пример станет
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
Второй вопрос о значенииval Mon, ... = Value
, Это действительно очень запутанно, если вы не смотрите на реализациюEnumeration
, Это не присвоение типа! Вместо этого он называет защищеннымmethod of the same name, Value
, который возвращает конкретный экземпляр типаValue
.
Так получилось, что ты можешь написатьval a, b, c = foo
в Scala, и для каждого значенияa
, b
, а такжеc
методfoo
будет вызываться снова и снова.Enumeration
использует этот трюк для увеличения внутреннего счетчика, чтобы каждое значение было индивидуальным.
Если вы откроете документы Scala API дляEnumeration
и нажмите наVisibility: All
, вы увидите, что этот метод появляется.