在类型化演员中,经典演员如何变成和不变成?



我正在构建一个实现,我想切换周围的行为。我如何在三种行为之间切换?我的问题是,我不知道改变行为的正确方法,然后在处理该消息后将其更改为主要行为。我已经试过了


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。

谢谢。

在类型演员中没有become,因为每次都返回一个新的行为。实际上,每次处理消息时都会调用become,这就是维护状态的方式。因此,如何在三种行为之间转换的答案是;只是返回当时需要的任何行为。

示例代码的问题是返回Behaviours.same意味着"不改变行为"。因此,将behav设置为Behaviours.same意味着EchoMachine返回Behaviours.same,这将使行为保持为EchoMachine,而不是返回到answerMachine

尝试设置behavanswerMachine:

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

最新更新