2016-12-09 5 views
0

私はアクターをいくつかの状態に置くことができます。初期状態では外部から渡される必要があります。アクター範囲外の受信関数を実装してアクターに渡す方法

class MyActor(openId: String, initialState: Receive) extends Actor { 

    val connected: (String) => Receive = (openId: String) => { 
    case AuthorizedOk(user) => context.become(authorized(user)) 
    ... 
    case message => unhandled(message) 
    } 

    val authorized: (IUserInfo) => Receive = (user: IUserInfo) => { 
    case SomeLogic => context.become(...) 
    case message => unhandled(message) 
    } 

    def receive: Actor.Receive = initialState 
} 

私はコンストラクタで初期状態connectedまたはauthorizedを設定する必要があります。もちろん、それは他の機能かもしれません。しかし、私はこれを実現する方法を理解していない:

new MyActor("id", ???) 

答えて

2

は私が

  1. 状態が俳優の事前開始ライフサイクルメソッドに渡した二つの可能性を参照してください

または

  1. アクターインスタンスを初期化するときに状態を渡すために使用できるオブジェクトコンパニオンがあります。行に何か:

    オブジェクトMyActor {

    DEF小道具(初期状態:YourState)= Props.actorOf(新しいMyActor(初期状態))

    }また

初期あなたの例の状態は、部分的な関数である必要はありません。あなたはそれをケースクラスとしてモデル化し、コンテキストを使用することができます。進化するにつれて状態間を移動することができます。

編集:もう少し明確にするための例を追加してください!

sealed trait State 
case object Authorized extends State 
case object UnAuthorized extends State 

class MyActor(state: State) extends Actor { 
    def receive: Receive = { 
    case state: State => 
    // do some logic 
    val newState = someLogic(state) 
    // evolve with the new state 
    context.become(active(newState)) 
    } 

    def active(newState: State): Receive = { 
    // do the pattern matching on the state and evolve 
    } 

    override def preStart(): Unit = { 
    super.preStart() 
    // send the initial state to this actor 
    self ! state 
    } 
} 
+0

お返事ありがとうございます。私の問題は、私は理解していない(スカラーには新しい)アクタースコープの外で関数を受け取るように実装する方法は、私はそれを俳優に渡すことができます。いくつかの例がいいでしょう! – zella

+1

なぜあなたはそれをしたいですか? Receive関数は、Actorを拡張するときにオーバーライドする必要があるActorクラスの関数です。さらに、あなたが取得するActorリファレンスは、基本のActorインスタンスへのプロキシに過ぎないので、あなたのメソッドやフィールドをあなたの例(許可された、接続されている)のように呼び出すことはできません。 – sparkr

関連する問題