我正在使用 akka 使用 scala 进行逻辑电路实现,我需要实现一个线 Actor(例如对于一个组件 Actor,如 AND 门):线应该传输一个信号,真或假。
问问题
293 次
1 回答
3
很高兴你正在学习 akka,这个任务是一个很好的起点。
在我们开始之前有几件事 - 您当前的代码和建模可能会在几个地方受到质疑。
- 为什么
AddComponent
需要一个wireName
?你打算用演员的名字来查找电线吗?通常我们用ActorRef
s 代替他们的名字。 - 另外为什么
StateChange
需要一个wireName
?真的有关系吗?我想说状态传播可以使用简单的消息来完成:StateChanged(state: Boolean)
- 我认为存储演员的名字没有任何好处,因为他们的一组
ActorRef
s 很好。 - 只处理原始类型通常不是一个好主意
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 回答