2016-08-24 7 views
3

このコードでakka Actorのreceiveメソッドがvalのように動作するのはなぜですか?なぜakkaのActorメソッドが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です。

この動作については、ここのdefがなぜvalのように計算されるのですか?

答えて

4

receiveは、PartialFunction [Any、Unit]を返し、そのPartialFunctionはActorsビヘイビアとして設定されます(context.become/unbecomeで変更できます)。

valとして認識される理由は、PartialFunctionインスタンスが変更されるまで再利用されるためです。

+0

ありがとうございますが、この[code](https://www.jdoodle.com/embed/v0/scala/2.12.0/14e)ではなぜdefのように動作しますか? – SaKou

+0

あなたがリンクしたコードは、PartialFunctionsとはまったく無関係です。戻り値の型をUnitに変更することで、これを証明できます。メソッドは、PartialFunctionの外部で副作用(printlns)を実行します。 Akkaは(キャッシュされた)PartialFunctionを呼び出します。 –

+0

上記のコードを参考にしてください。パーシャルタイプをPartial = PartialFunction [Any、Unit]に変更しました 違いが表示されません – SaKou

関連する問題