我有一个状态相当复杂的演员,但我们说它是一个列表。我提出了以下例子:
class Account
class Bank extends Actor {
var accounts = List[Account]()
def receive = {
case x: Account =>
accounts ++= List(x)
println(accounts.length)
case _ =>
}
}
基本上我希望这个actor包装List,我希望能够通过以下方式添加到该集合:
val system = ActorSystem("banks")
val bankActor = system.actorOf(Props[Bank], name = "mybank")
bankActor ! new Account
我写这个演员甚至接近最佳和安全吗?有没有更好的方法,没有引入var?
答案 0 :(得分:8)
有没有更好的方法,没有引入var?
在Actor中拥有可变状态(vars)是完全可以的。事实上,这是拥有演员的主要用例。 Actor的可变状态是线程安全的,只有少数例外。主要的是你不应该close over
在actor的receive方法中Future
内的相互作用。
答案 1 :(得分:5)
我同意在var
中使用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 _ =>
}
}
答案 2 :(得分:2)
使用Akka FSM transitions时,可以在演员中使用不带变量和可变数据结构的FP,或者在Viktor Klang年前提出的the Minimalist Scala Actor中进行操作。 Here是使用此方法倒计时的计数器示例。