преобразовать функцию в частичную функцию scala

У меня есть запечатанная черта:

sealed trait ActorMessage
case class AddX(x: Int) extends ActorMessage
case class RemoveX(x: Int) extends ActorMessage

Также у меня есть функция для обработки всех сообщений и предупреждения о неполном совпадении:

def handleMessage: ActorMessage => Unit = {
  case AddX(x) => ...
  case RemoveX(x) => ...
}

Актеру требуется PartialFunction [Any, Unit]. PartialFunction расширяет функцию, что означает, что я не могу присвоить своей функции PartialFunction.

Я написал простой конвертер:

def liftToPartialFunction[FUND <: PFUND, B, PFUND](f: Function[FUND, B]): PartialFunction[PFUND, B] = new PartialFunction[PFUND, B] {
  override def isDefinedAt(x: PFUND): Boolean = x.isInstanceOf[FUND]
  override def apply(v1: PFUND): B = f(v1.asInstanceOf[FUND])
}

Но есть ли лучший способ сделать это? Или есть эквивалент в стандартной библиотеке Scala?


person kpbochenek    schedule 15.07.2015    source источник


Ответы (3)


Обычно я делаю что-то вроде этого:

override def receive = {
  case m: ActorMessage => m match {
    // You'll get non-exhaustive match warnings here
    case AddX(x) => /* ... */
    case RemoveX(x) => /* ... */
  }
  case m => /* log a warning */
}

Точно так же, используя вашу функцию handleMessage:

override def receive = {
  case m: ActorMessage => handleMessage(m)
  case m => /* log a warning */
}
person Chris Martin    schedule 15.07.2015
comment
Я, вероятно, буду придерживаться последнего примера, но, возможно, знаю, смогу ли я сделать свою функцию приема так, чтобы она выглядела так: def receive = handleMessage илиElse handleEvent илиElse ... - person kpbochenek; 15.07.2015

Вы можете использовать Function.unlift -

val f: Throwable => Option[String] = {
  case e: NullPointerException => Some("nah it's ok")
  case e => None
}

Future(null.toString).recover(Function.unlift(f))
// Future(Success(nah it's ok))
person pyrospade    schedule 02.02.2018

Вы можете просто объявить handleMessage как частичную функцию:

def handleMessage: PartialFunction[ActorMessage,Unit] = {
    case AddX(x) => ...
    case RemoveX(x) => ...
}
person Lee    schedule 15.07.2015
comment
Это не предупредит меня о неполном совпадении. - person kpbochenek; 15.07.2015