Так как мой код при получении соответствует Actor.Receive?... Что это за стиль сопоставления с образцом?
В Scala case
является распространенным видом частичных функций.Например:
val oneOrTwo: PartialFunction[Int, String] = {
case 1 => "one"
case 2 => "two"
}
// oneOrTwo: PartialFunction[Int,String] = <function1>
val reciprocal: PartialFunction[Double, Double] = { case i if i != 0 => 1 / i }
// reciprocal: PartialFunction[Double,Double] = <function1>
Следовательно, case
частичные функции могут использоваться для реализации receive
с подписью PartialFunction[Any, Unit]
.
Тип аргумента Any
позволяет использоватьcase
для проверки на input
любого типа по вашему желанию (например, SetRequest(key, value)
, GetRequest(key)
в вашем примере кода).
В типе возврата Unit
позволяет ввести любойкод обработки сообщений (например, sender() ! Status.Success
, response match {...}
в вашем примере кода) и не требует возвращаемого значения.
receive
, кажется, не получает аргументов, так что же я на самом деле пытаюсь сопоставить?
Ваш класс расширяется Actor
, поэтому при переопределении receive
,вам нужно реализовать метод, объявленный в черте Actor
(см. ниже, из исходного кода Akka ), который вы уже сделали с вашей частичной функцией case
.
object Actor {
type Receive = PartialFunction[Any, Unit]
// ...
}
trait Actor {
def receive: Actor.Receive
// ...
}
РасширяяActor
и реализуя метод receive
, Akka оснащает ваш класс всеми функциями актера, управляемого сообщениями, включая почтовый ящик , и назначает диспетчера для отправки любых сообщений, отправленных ему (например, myActor ! GetRequest(key)
от другого субъекта).) как input
к receive
методу.