如何在里面用可变集合模拟actor?

Wil*_* Am 1 scala akka

我有一个具有相当复杂状态的演员,但让我们说它是一个列表.我想出了以下示例:

class Account
class Bank extends Actor {
  var accounts = List[Account]()
  def receive = {
    case x: Account =>
      accounts ++= List(x)
      println(accounts.length)
    case _ => 
  }
}
Run Code Online (Sandbox Code Playgroud)

基本上我希望这个actor包装List,我希望能够通过以下方式添加到该集合:

val system = ActorSystem("banks")
val bankActor = system.actorOf(Props[Bank], name = "mybank")
bankActor ! new Account
Run Code Online (Sandbox Code Playgroud)

我写这个演员甚至接近最佳和安全吗?有没有更好的方法,没有引入var?

Sou*_*nta 8

有没有更好的方法,没有引入var?

在Actor中有可变状态(变量)是完全可以的.事实上,这是拥有演员的主要用例.Actor的可变状态是线程安全的,只有少数例外.主要是你不应该在演员的接收方法中的close over内部Future相互作用.


sou*_*ica 5

我同意在a var中使用a Actor很好.

作为替代方案,这里使用的另一种方法become避免了var.

class Bank extends Actor {
  def receive = receiveAccounts(List.empty)

  def receiveAccounts(accounts: List[Account]): Receive = {
    case x: Account =>
      println(accounts.length + 1)
      context.become(receiveAccounts(x :: accounts))

    case _ =>
  }
}
Run Code Online (Sandbox Code Playgroud)