gpt4 book ai didi

erlang - 为什么 gen_fsm 状态方法必须返回一些东西?

转载 作者:行者123 更新时间:2023-12-01 23:32:42 24 4
gpt4 key购买 nike

我目前正在阅读LYAE,我试图理解为什么gen_fsm状态方法必须根据source返回任何内容。

{reply, Reply, NextStateName, NewStateData}
{reply, Reply, NextStateName, NewStateData, Timeout}
{reply, Reply, NextStateName, NewStateData, hibernate}

{next_state, NextStateName, NewStateData}
{next_state, NextStateName, NewStateData, Timeout}
{next_state, NextStateName, NewStateData, hibernate}

{stop, Reason, Reply, NewStateData}
{stop, Reason, NewStateData}

有人可以向我解释一下我是否有 3 个状态方法:abc 并且状态机将定义如下:

a()->
receive
something -> b();
_ -> error(err)
end.

b()->
receive
somethingelse-> c();
_ ->
end.

为什么我需要下一个状态方法的返回结果?

someMethod()->
receive
_ ->
{next_state, NextStateName, NewStateData}=someNextMethod(),
//why would i place code here? What could i possibly do with the above tuple ?
end.

我不明白为什么要在调用下一个状态方法之后放置代码?所有调用都是递归的,因此除了在 fsm 结束或抛出后我实际上可以执行某些操作的初始状态之外,为什么我要将代码放在其他状态中?

最佳答案

你是对的,不需要返回值,并且你必须递归调用某个将等待接收语句的函数:有必要让事物发展(因为变量的不变性)并使用react到一条新消息。

重点是,您的示例是一个单模块状态机,而当您使用 gen_fsm 行为时,至少有 2 个模块在起作用:

  • 隐式通用 gen_fsm 行为模块本身
  • 以及您正在编写的特定回调模块。

每个模块都有非常不同的作用。

  • 通用消息负责保持状态并接收消息(这就是为什么你不能在代码中处理这一点),它提供不同类型的消息:同步或异步,一种状态或任何状态,通过 gen_fsm 接口(interface)或“自由发送”消息...它还管理操作模式:初始化、停止、代码更改...它还在后台管理与 OTP 系统的接口(interface)。由于它是一个通用模块,它无法知道您想要定义的状态和转换。
  • 回调模块由gen_fsm(几乎)每次收到消息时调用。调用的函数取决于状态和消息。回调模块负责定义状态机所需的状态和转换,这是通过发送回 gen_fsm 的返回值来完成的。返回值包含多个字段,下一个状态是强制性的,因为 gen_fsm 必须知道要“进入”哪个状态 - 进入一个状态是一个图像,它只是存储在变量中并由主 fsm 循环维护的状态名称- 它还可以维护更多信息(通常也称为令人困惑的状态信息,例如门锁系统的当前密码)。返回值还可能包含其他内容,例如在同步消息的情况下对调用者的回复、下一条传入消息之前的超时、停止 fsm 的请求...

简而言之,gen_fsm 是一个简单的递归循环,等待“事件”消息,该消息至少维护 State_name 变量。它使用存储在回调模块中的辅助函数来描述其行为。与您所说的相差不大,但具有通用模块带来的限制 - 以及集成到 OTP 和经过良好验证的代码的优势。

关于erlang - 为什么 gen_fsm 状态方法必须返回一些东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58614487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com