Частичное совпадение паттерна функции разделено на класс и черту - PullRequest
1 голос
/ 27 июля 2011

Lift использует PartialFunction при реализации Comet Actors, и вы обычно заканчиваете этим в своем классе:

override def lowPriority: PartialFunction[Any,Unit] = {
  case MyCaseClass1(a)        => do something here
  case MyCaseClass2(a)        => do something here
  case AlwaysPresentCaseClass => default action
}

Что бы я хотел сделать, и я не уверен, если этовозможно даже разделить эту частичную функцию так, чтобы последний случай мог быть перемещен в черту.

Поэтому, когда у меня есть новый кометный актер, я просто делаю:

class MyNewComet extends MyActorTrait {
  override def lowPriority: PartialFunction[Any,Unit] = {
    case MyCaseClass1(a)        => do something here
    case MyCaseClass2(a)        => do something here
  }
}

И как-тоу черты MyActorTrait будет отсутствовать

case AlwaysPresentCaseClass => default action

Ответы [ 2 ]

9 голосов
/ 27 июля 2011

Вы можете составлять частичные функции, используя метод orElse:

val f1: PartialFunction[Any, String] = {
  case 22 => "hallo"
}
val f2: PartialFunction[Any, String] = {
  case "rara" => "welt"
}

val f = f1 orElse f2 // f falls back to f2 if undefined in f1
f(22)
f("rara")
0 голосов
/ 27 июля 2011

Попробуйте:

trait MyActorTrait extends /* whatever class provides lowPriority */ {
   def default: PartialFunction[Any, Unit] = {
           case AlwaysPresentCaseClass => default action
   }

   abstract override def lowPriority: PartialFunction[Any,Unit] =
       super.lowPriority orElse default
}

Единственная проблема в том, что вы не можете сделать MyNewComet extends MyActorTrait.Вместо этого вы можете иметь либо class MyNewCometDefault extends MyNewComet with MyActorTrait, либо new MyNewComet with MyActorTrait.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...