如何在类型化演员中创建变量?

How to create variables in typed actors?

这是使用 Akka Typed 创建本地 actor 变量的正确方法吗(参见名为 statevar)?

示例:

object Main {
  def behavior(name: String): Behavior[String] = {
    var state = s"$name's state."
    Static {
      case str: String =>
        println(s"$name: Updating state.")
        state = state + str
        println(s"$name: State is now $state")
    }

  }

  def main(args: Array[String]): Unit = {
    def mainBe: Behavior[String] =
      ContextAware {
        context =>
          val a1 = context.spawn(Props(behavior("Actor 1")), "actor-1")
          val a2 = context.spawn(Props(behavior("Actor 2")), "actor-2")
          Static {
            case str =>
              a1 ! str + "(1)"
              a2 ! str + "(2)"
          }

      }


    val system = ActorSystem("Tester", Props(mainBe))
    system ! "John"
    system ! "Smith"
    Await.result(system.whenTerminated, 1 second)
  }
}

输出:

Actor 1: Updating state.
Actor 2: Updating state.
Actor 1: State is now Actor 1's state.John(1)
Actor 2: State is now Actor 2's state.John(2)
Actor 1: Updating state.
Actor 2: Updating state.
Actor 1: State is now Actor 1's state.John(1)Smith(1)
Actor 2: State is now Actor 2's state.John(2)Smith(2)

是的,这是执行此操作的正确方法。但是依赖可变变量并不总是可取的,在许多情况下,必须分配新行为的性能开销不如不可变行为为您提供的针对简单编程错误的改进弹性重要。您的示例如下所示:

def behavior(name: String) = behavior(name, s"$name’s state.")
def behavior(name: String, state: String): Behavior[String] =
  Total { str =>
    println(s"$name: Updating state.")
    val nextState = state + str
    println(s"$name: State is now $nextState")
    behavior(name, nextState)
  }

无法使用新值更新引用意味着编译器将限制您可以做的错误(例如更新两次或根本不更新)。