2016-08-24 2 views
3

Мне интересно, почему метод приема akka Actor в этом коде ведет себя как val?Почему метод приема в акке ведет себя как 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?

ответ

4

receive возвращает PartialFunction [Any, Unit], и PartialFunction засевается как поведение Actors (может быть изменено с помощью context.become/unbecome).

Причина, по которой это воспринимается как val, заключается в том, что экземпляр PartialFunction повторно используется до изменения.

+0

Спасибо, но почему в этом [код] (https://www.jdoodle.com/embed/v0/scala/2.12.0/14e) он ведет себя как def? – SaKou

+0

Код, к которому вы привязаны, полностью не связан с PartialFunctions, вы можете это доказать, изменив тип возврата на Unit. Ваши методы выполняют побочные эффекты (printlns) за пределами PartialFunction. Акка вызывает (кэшированную) PartialFunction. –

+0

Не могли бы вы посмотреть в приведенном выше коде, я изменил тип Partial на: type Partial = PartialFunction [Any, Unit] Я не вижу разницы – SaKou

Смежные вопросы