Направление скала перечисление с перечисления и использования коллекции


Я просто реализовать направление перечисления

object Direction extends Enumeration {
  type Direction = Value
  val Up, Right, Down, Left = Value

  val pairs = HashSet() ++ List((HashSet() ++ List(Up, Down)), (HashSet() ++ List(Right, Left)))

  def isOpposite(one: Direction, other: Direction): Boolean = {
    pairs.contains(HashSet() ++ List(one, other))
  }
}

Использования

direction match {
  case Right => ...
  case Left => ...
  case Up => ...
  case Down => ...
}

if(Direction.isOpposite(d1, d2))...

Я могу улучшить это как?



353
2
задан 4 декабря 2011 в 06:12 Источник Поделиться
Комментарии
1 ответ

Использовать алгебраический тип данных (АТД):

abstract class Direction(val opposite: Direction)
case object Up extends Direction(Down)
case object Down extends Direction(Up)
case object Left extends Direction(Right)
case object Right extends Direction(Left)

или:

abstract class Direction {
def isOpposite(d: Direction): Boolean
}
case object Up extends Direction {
def isOpposite(d: Direction) = d == Down
}
case object Down extends Direction {
def isOpposite(d: Direction) = d == Up
}
case object Left extends Direction {
def isOpposite(d: Direction) = d == Right
}
case object Right extends Direction {
def isOpposite(d: Direction) = d == Left
}

3
ответ дан 4 декабря 2011 в 07:12 Источник Поделиться