scala之为什么 akka 中的 Receive Actor 方法表现得像一个 val
mayingbao
阅读:13
2025-01-19 22:14:33
评论:0
我想知道为什么这段代码中 akka Actor 的 receive 方法表现得像一个 val ?
import akka.actor.{ ActorRef, ActorSystem, Props, Actor }
import scala.concurrent.duration._
// Define Actor Messages
case class WhoToGreet(who: String)
// Define Greeter Actor
class Greeter extends Actor {
def receive = {
println("in receive")
receiveHandler
}
def receiveHandler: Receive = {
case WhoToGreet(who) => println(s"Hello $who")
}
}
object HelloAkkaScala extends App {
// Create the 'hello akka' actor system
val system = ActorSystem("Hello-Akka")
// Create the 'greeter' actor
val greeter = system.actorOf(Props[Greeter], "greeter")
// Send WhoToGreet Message to actor
greeter ! WhoToGreet("Akka")
greeter ! WhoToGreet("Akka")
greeter ! WhoToGreet("Akka")
//shutdown actorsystem
system.terminate()
}
输出:
in receive
Hello Akka
Hello Akka
Hello Akka
当它应该是:
in receive
Hello Akka
in receive
Hello Akka
in receive
Hello Akka
而接收是一个定义。
关于这种行为的任何想法,为什么这里的 def 像 val 一样计算?
请您参考如下方法:
receive
返回一个 PartialFunction[Any, Unit],并且该 PartialFunction 被植入为 Actors 行为(可以通过 context.become/unbecome 更改)。
它被视为 val
的原因是 PartialFunction 实例在更改之前被重用。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。