我如何让经典演员成为和不适合类型演员
Posted
技术标签:
【中文标题】我如何让经典演员成为和不适合类型演员【英文标题】:How do i do classic actor become and unbecome in typed actor 【发布时间】:2021-11-16 11:13:22 【问题描述】:我正在构建一个实现,我想切换行为。如何在三种行为之间切换并返回?我的问题是我不知道更改行为的正确方法,然后在处理该消息后将其更改回主要行为。这个我试过了
def answerMachine: Behavior[Message] = Behaviors.setup context: ActorContext[Message] =>
Behaviors.receiveMessage
case s@Behave =>
println("Am told to behave: changing like chameleon")
EchoMachine(s, Behaviors.same)
case Back() =>
println("Now am back")
Behaviors.same
def EchoMachine(firstMsg: Message, behav: Behavior[Message]): Behavior[Message] = Behaviors.setup context: ActorContext[Message] =>
Behaviors.receiveMessage
case Back() =>
println("I have changed to EchoMachine..")
behav
case Behave =>
println("I am behaving oo")
behav
val system = ActorSystem(TypedConvo.answerMachine, "Machine")
system.ref ! Behave
system.ref ! Back()
当我发送 Back()
时,我预计 answerMachine
会收到消息,但即使在改变行为之后也是 EchoMachine。
谢谢。
【问题讨论】:
【参考方案1】:类型化的actors中没有become
,因为每次都会返回一个新的行为。实际上,每次处理消息时都会调用become
,这就是维护状态的方式。因此,如何“在三种行为之间切换”的答案就是返回当时需要的行为。
示例代码的问题是返回Behaviours.same
意味着“不要改变行为”。因此,将behav
设置为Behaviours.same
意味着EchoMachine
返回Behaviours.same
,从而将行为保持为EchoMachine
,而不是返回answerMachine
。
尝试将behav
设置为answerMachine
:
Behaviors.receiveMessage
case s@Behave =>
println("Am told to behave: changing like chameleon")
EchoMachine(s, answerMachine)
case Back() =>
println("Now am back")
Behaviors.same
现在,处理完消息后,EchoMachine
将返回 answerMachine
作为新行为。当然,如果EchoMachine
总是恢复为answerMachine
,它可以只返回answerMachine
。
【讨论】:
谢谢,有道理以上是关于我如何让经典演员成为和不适合类型演员的主要内容,如果未能解决你的问题,请参考以下文章