我最近研究了 scala 多线程教程,偶然发现了一个在 Actor 中实现的方法:
class MyActor extends Actor
def receive = {
case "test" => println("received test")
case _ => println("received unknown message")
}
}
虽然我认为我知道该方法的作用,但我不知道如何使用这种方法(因为它不接受任何参数)。
虽然这个例子是关于 Akka 的,但我认为这与 Akka 无关
最佳答案
实际上 receive
返回部分函数。当您检查 Actor
的源代码时,您会看到;
type Receive = PartialFunction[Any, Unit]
因此,这意味着通过重写接收,您提供了一个部分函数,它接受任何参数和返回单元。稍后,如果您的 actor 收到消息,Akka 本身将使用此部分函数对传入消息进行模式匹配。
-- 编辑--
对于更具体的示例,假设您创建了一个类似的对象;
object Obj {
def receive: PartialFunction[Any, Unit] = {
case "test" => println("test case")
case 1 => println("int 1 case")
case d: Double => println("double case $d")
case _ => println("rest")
}
}
然后你可以像调用常规方法一样调用这个偏函数;
scala> Obj.receive(1)
int 1 case
scala> Obj.receive("test")
test case
Actor case 是特定的,只是你不直接调用接收,你提供它,如果消息到达,Akka 自己调用它;
protected[akka] def aroundReceive(receive: Actor.Receive, msg: Any): Unit = receive.applyOrElse(msg, unhandled)
当然这个调用取决于很多参数,比如你使用的拓扑结构,邮箱等等。
https://stackoverflow.com/questions/40800074/