为什么这个循环的循环部分反应阻塞不像我期望的那样“循环”?

时间:2012-10-12 19:25:20

标签: scala actor

我正在做家庭作业,修改我教授创建的代码。不幸的是,他目前无法使用我所以我正在接触到stackoverflow人群。

此片段来自文件“Peer.scala”,该文件与另一个类“RemoteActorChat.scala”中的actor进行通信。为了简洁起见,我只包含了我认为是问题原因的片段。如果其余的代码在查找解决方案时很有用,我很乐意发布它。

我的目的是在连续循环中从控制台获取Peer捕获输入,同时对从RemoteChatActor接收的任何消息做出反应。

...

def act {
...
loop {
  val textInput = Console.readLine(name + ">").toString()
  textInput match {
    case "Unsubscribe" =>
      unsubscribe

    case "Subscribe" =>
      subscribe(name))

    case "?" =>
      println("Type any message to send it to the chatroom")
      println("Type 'Unsubscribe' (without quotes) to leave the chatroom")
      println("Type 'Subscribe' (without quotes) to re-join the chatroom")

    case _ =>
      post(textInput)
  }

  react {
    case Post(msg) =>
      println(name + " got a post = " + msg)
  }
}

}

...

当inputText与_匹配时,调用post函数,它是什么东西,我得到另一个提示。如果我愿意,我可以整天发布消息。

但是,当inputText与“Unsubscribe”,“Subscribe”或“?”匹配时,行为会有所不同。案例中的陈述被执行IE)取消订阅或订阅函数被调用并按预期执行它们的操作。但是,我没有收到提示,继续从控制台发送输入。同伴基本上只是挂起了这一点。我期待另一个提示,但控制台窗口只是空的,不需要任何额外的输入。

显然,我对这应该如何运作的理解是有缺陷的 我误解了什么,我怎么能按照我的意愿做到这一点?

1 个答案:

答案 0 :(得分:0)

演员正在等待Post内的react。它会一直持续下去。由于您只发送一个案例,所以只有这种情况可以通过。

如果你想让其他案例有效,或者让他们发送react块可以接收的消息(至少作为反应块内的case _),或移动反应阻止所以只有当Post在某个时刻回来时才会输入。