Я новичок в Scala, так что будь мил, пожалуйста. Вы должны извинить меня, если я упускаю что-то очевидное.
Я пытаюсь создать структуру типа enum для представления дней недели в Scala.
Мне нужен метод, который принимает строку, которая может быть либо цифрами от 1 до 7, полным именем дня или трехбуквенным сокращением, с любой прописной буквой, и возвращает правильный день. В идеале я хочу иметь возможность получить правильный день, просто написав DayOfWeek(_)
, что, насколько я понимаю, означает, что этот метод должен быть apply
. Отдельные значения также должны быть подклассами (или смешивать) черту, называемую CalendarField
, которая на данный момент не определяет методов или членов.
Это моя текущая попытка:
object DayOfWeek extends Enumeration with CalendarField {
val Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday = Value
def apply(v:String) = {
v.toUpperCase match {
case Int(x) => x match {
case 1 => Sunday
case 2 => Monday
case 3 => Tuesday
case 4 => Wednesday
case 5 => Thursday
case 6 => Friday
case 7 => Saturday
case _ => throw new IllegalArgumentException("Invalid value for day of week: " + v)
}
case "SUN" | "SUNDAY" => Sunday
case "MON" | "MONDAY" => Monday
case "TUE" | "TUEDAY" => Tuesday
case "WED" | "WEDNESDAY" => Wednesday
case "THU" | "THURSDAY" => Thursday
case "FRI" | "FRIDAY" => Friday
case "SAT" | "SATURDAY" => Saturday
case _ => throw new IllegalArgumentException("Invalid value for day of week: " + v)
}
}
}
object Int {
def unapply(s : String) : Option[Int] = try {
Some(s.toInt)
} catch {
case _ : java.lang.NumberFormatException => None
}
}
Это не работает по нескольким пунктам:
- Отдельные значения не являются подклассами
CalendarField
- они просто Value
с.
- Я определил
apply
метод, но DayOfWeek(_)
не работает - мое (смутное) предположение, что это потому, что он ожидает вызова конструктора, а DayOfWeek
является объектом, а не классом? Или это потому, что перечисление (s: String) уже используется? Есть ли способ обойти это?
Будем весьма благодарны за любые предложения о том, как обойти эти проблемы или более точные решения. Спасибо.