Может кто-нибудь дать мне более простое решение для следующего кода (который разворачивает список целых чисел задана структура 0xFC :: len :: payload :: ... :: 0x0A :: 0x0D
):
object Payload {
def unapply(z: List[Int]): Option[List[Int]] = if (z.length == z.head + 1) Some(z tail) else None
}
object EndToken {
def unapply(z: List[Int]): Option[List[Int]] = z.reverse match {
case 0x0D :: 0x0A :: tail => Some(tail.reverse)
case _ => None
}
}
object Message {
def unapply(z: List[Int]): Option[List[Int]] = z match {
case 0xFC :: EndToken(x) => Some(x)
case _ => None
}
}
object Main extends App {
val x = List(0xFC, 0x03, 0x01, 0x02, 0x03, 0x0A, 0x0D)
x match {
case Message(Payload(payload)) => println (payload)
case _ => println("No match")
}
}
Что-то вроде:
object Message {
def unapply(z: List[Int]): Option[List[Int]] = z match {
case 0xFC :: Payload(x) :: 0x0A :: 0x0D => Some(x)
case _ => None
}
}
Но, конечно, ::
ожидает элементы, а не списки, поэтому это не работает ...