Functional programming 长生不老药
我对长生不老药还不熟悉,读了一本书,做了一些例子。下面是一段让我在这里提出问题的代码:Functional programming 长生不老药,functional-programming,erlang,elixir,otp,gen-server,Functional Programming,Erlang,Elixir,Otp,Gen Server,我对长生不老药还不熟悉,读了一本书,做了一些例子。下面是一段让我在这里提出问题的代码: defmodule Sequence.Server do use GenServer def init(initial_number)do {:ok,initial_number} end def handle_call(:next_number, _from, current_number)do {:reply, current_numbe
defmodule Sequence.Server do
use GenServer
def init(initial_number)do
{:ok,initial_number}
end
def handle_call(:next_number, _from, current_number)do
{:reply, current_number,current_number+1}
end
end
正如我所知,init函数是在服务器初始化时调用的,我们正在定义一些参数,这将是服务器的初始状态。让我感到困惑的是,当前\u编号和初始\u编号是如何相互关联的,我的意思是在代码中我们没有这样说
当前\u编号=初始\u编号
因为当我调用
GenServer.call(some\u process\u id,:next\u number)
时,它从100开始,例如,如果start\u link的参数是100。Elixir如何理解它必须从100开始,当我们在初始状态和当前\u数
参数之间没有任何映射时init
的结果是{:ok,initial\u state}
,其中状态值是GenServer持有的
handle\u call
的签名实际上是handle\u call(请求、发件人、当前状态)
,它返回{:reply、result、new\u state}
这意味着当您执行GenServer.call(pid,:next\u number)
时,将导致调用handle\u call(:next\u number,\u from,state)
,其中,状态(作为current\u number
传递)以initial\u number
开始,并且handle\u call
的结果使用值current\u number
保存新状态
下次调用GenServer.call(pid,:next_number)
时,将使用新状态调用它,然后返回新状态,依此类推。初始化/1
的目的是设置GenServer
的内部状态。修改此GenServer
内部状态的唯一方法是通过call
-ing、cast
-ing或发送常规消息(然后由handle\u info/2
回调处理)
这些函数(分别为handle\u call/3
和handle\u cast/2
)将在GenServer
的内部状态作为函数参数的最后一个参数传入时调用
考虑以下场景:
100
初始化GenServer
GenServer
-:next\u number
发送一条消息(更具体地说是一个呼叫
)handle\u调用(:next\u number,\u from,current\u number)
回调函数,其中current\u number
的初始值为100
{:reply,current\u number,current\u number+1}
,您应该理解为:reply
(元组的第一个元素)指示它将答复调用者;元组的第二个元素将是返回给调用者的值(在本例中,它将是number100
);元组的最后一个元素是GenServer的新状态
当前编号+1
,因此101
GenServer
发送另一个:next_number
call
时,它将遵循前面的步骤,但内部状态现在将为101
,从功能返回后,新状态将为102
,等等我希望它能帮助你我想推荐一本伟大的LYSE之书,特别是章节和,以便理解gen_服务器(和其他gen_*摘要)是如何编写的。强烈推荐阅读整本书,它也很有趣:)谢谢大家:)