Краткий способ составления списка дней недели в Scala - PullRequest
4 голосов
/ 20 мая 2011

Я новичок в 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
    }
}

Это не работает по нескольким пунктам:

  1. Отдельные значения не являются подклассами CalendarField - они просто Value с.
  2. Я определил apply метод, но DayOfWeek(_) не работает - мое (смутное) предположение, что это потому, что он ожидает вызова конструктора, а DayOfWeek является объектом, а не классом? Или это потому, что перечисление (s: String) уже используется? Есть ли способ обойти это?

Будем весьма благодарны за любые предложения о том, как обойти эти проблемы или более точные решения. Спасибо.

Ответы [ 3 ]

6 голосов
/ 21 мая 2011

Я бы, наверное, реализовал что-то вроде этого:

sealed trait DayOfWeek
case object Monday extends DayOfWeek
case object Tuesday extends DayOfWeek
// etc.

object DayOfWeek {
   def unapply(s: String): Option[DayOfWeek] = s.toUpperCase match {
      case Int(x) => x match {
         case 1 => Some(Sunday)
         // ...
         case _ => None
      }
      case "SUN" | "SUNDAY" => Some(Sunday)
      // ...
      case _ => None
   }

   def apply(s: String): DayOfWeek = s match {
      case DayOfWeek(d) => d
      case _ => throw new IllegalArgumentException(
                   "Invalid value for day of week: " + s)
   }

}

0 голосов
/ 15 мая 2017
object WeekEnumerator{

sealed trait Week
object WeekDay extends Week
object WeekEnd extends Week

val sat, sun = WeekEnd
val mon, tue, wed, thr, fri = WeekDay

def isWorkingDay(day:WeekEnumerator.Week):Boolean = day match{
case day @ WeekEnd => false
case day @ WeekDay => true
}
}

Использование: WeekEnumerator.isWorkingDay (WeekEnumerator.sun)

0 голосов
/ 20 мая 2011

Использование объектов case решило бы проблему 1, поскольку объекты case могут иметь общий базовый класс. Поскольку этот базовый класс не наследуется от Enumeration, у вас не будет проблем с унаследованными методами apply. Вот пример кода:

sealed abstract class DayOfWeek {
  def apply(s:String) = {
    //...
  }
}

case object Monday extends DayOfWeek
case object Tuesday extends DayOfWeek
//and so on...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...