Я должен сказать, что не понимаю классов перечисления Scala. Я могу скопировать и вставить пример из документации, но я понятия не имею, что происходит.
object WeekDay extends Enumeration {
type WeekDay = Value
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
- Что значит
type WeekDay = Value
и зачем мне это писать? - Почему
val Mon = Value
? Что это хотя бы значит? - Почему мне нужно импортировать
WeekDay
объект? И, - когда я пишу
val day = WeekDay.Mon
, почему это типWeekDay.Value
, а не типWeekDay
?
Ответы:
у
Enumeration
признака есть член типа,Value
представляющий отдельные элементы перечисления (на самом деле это внутренний класс, но здесь разница не имеет значения).Таким образом
object WeekDay
наследует этот член типа. Строкаtype WeekDay = Value
- это просто псевдоним типа . Это полезно, потому что после импорта в другое место с помощьюimport WeekDay._
вы можете использовать этот тип, например:Вместо этого минимальная версия будет просто:
и вам не нужно импортировать содержимое
object WeekDay
, но тогда вам нужно будет использовать типWeekDay.Value
и квалифицировать отдельные члены. Таким образом, пример станетВторой вопрос о значении
val Mon, ... = Value
. Это действительно очень сбивает с толку, если не смотреть на реализациюEnumeration
. Это не присвоение типа! Он вместо вызова защищенного метода с тем же именем ,Value
, который возвращает экземпляр бетонную типаValue
.Бывает так , что вы можете написать
val a, b, c = foo
в Scala, и для каждого значенияa
,b
иc
методfoo
будет вызываться снова и снова.Enumeration
использует этот трюк для увеличения внутреннего счетчика, чтобы каждое значение было индивидуальным.Если вы откроете документы Scala API для
Enumeration
иVisibility: All
нажмете на , вы увидите, что появляется этот метод.источник
Open(Mon, 8, 20)
и дни останутся плоским перечислением.