首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在类型的参与者中创建变量?

如何在类型的参与者中创建变量?
EN

Stack Overflow用户
提问于 2015-12-21 02:20:18
回答 1查看 105关注 0票数 0

这是用Akka类型创建本地参与者变量的正确方法(参见名为varstate)吗?

示例:

代码语言:javascript
复制
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)
  }
}

输出:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-21 20:49:57

是的,这是正确的方法。但是,依赖可变变量并不总是更好,在许多情况下,必须分配新行为的性能开销不如对不可变行为给您带来的简单编程错误的改进弹性那么重要。你的例子看起来应该是:

代码语言:javascript
复制
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)
  }

无法用新值更新引用意味着编译器将限制您可能做错的事情(比如更新两次或根本不更新)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34388131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档