2013-12-15 18 views

回答

3

這是偉大的,你正在學習阿卡,任務是一個好地方開始。

在我們開始之前,有幾件事情 - 您當前的代碼和建模可能會在幾個地方受到質疑。

  1. 爲什麼AddComponent需要wireName?你打算通過演員的名字找到電線嗎?通常我們使用ActorRef而不是他們的名字。
  2. 又爲什麼StateChange需要wireName?真的有關係嗎?我會說狀態傳播可以使用簡單的消息來完成:StateChanged(state: Boolean)
  3. 我不認爲存儲演員的姓名是有好處的,因爲他們的一組ActorRef很好。
  4. 處理原始類型如current: Boolean通常不是一個好主意,我們希望給語義賦予我們的消息,就像您對StateChange所做的那樣,所以我也會在這裏使用它。

一些代碼,我想出了:

import akka.actor.{ActorLogging, Actor, ActorRef} 

case class AddComponent(actor: ActorRef) 
case class StateChange(state: Boolean) 

class Wire(var currentState: Boolean) extends Actor with ActorLogging { 
    var connections = Set.empty[ActorRef] 

    def receive: Actor.Receive = { 
    case AddComponent(actor) => 
     connections += actor 

    case StateChange(state) => 
     currentState = state 
     val connectionsToPropagateTo = connections - sender // Don't propagate back to sender 
     connectionsToPropagateTo.foreach { component => 
     component ! StateChange(currentState) // Send the component a StateChange message. 
     } 
    } 
} 

您可以根據需要簡單地RemoveComponent和其他的東西擴展此。

+0

我不明白... – user2947615

+0

不明白?你可以詳細說明一下... –