0

我正在使用 akka 使用 scala 进行逻辑电路实现,我需要实现一个线 Actor(例如对于一个组件 Actor,如 AND 门):线应该传输一个信号,真或假。

4

1 回答 1

3

很高兴你正在学习 akka,这个任务是一个很好的起点。

在我们开始之前有几件事 - 您当前的代码和建模可能会在几个地方受到质疑。

  1. 为什么AddComponent需要一个wireName?你打算用演员的名字来查找电线吗?通常我们用ActorRefs 代替他们的名字。
  2. 另外为什么StateChange需要一个wireName?真的有关系吗?我想说状态传播可以使用简单的消息来完成:StateChanged(state: Boolean)
  3. 我认为存储演员的名字没有任何好处,因为他们的一组ActorRefs 很好。
  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和其他东西。

于 2013-12-15T20:41:14.537 回答