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 实例在更改之前被重用。


标签:Scala
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号