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
    (元组的第一个元素)指示它将答复调用者;元组的第二个元素将是返回给调用者的值(在本例中,它将是number
    100
    );元组的最后一个元素是
    GenServer的新状态
    -
    当前编号+1
    ,因此
    101
  • 当您向此
    GenServer
    发送另一个
    :next_number
    call
    时,它将遵循前面的步骤,但内部状态现在将为
    101
    ,从功能返回后,新状态将为
    102
    ,等等

  • 我希望它能帮助你我想推荐一本伟大的LYSE之书,特别是章节和,以便理解gen_服务器(和其他gen_*摘要)是如何编写的。强烈推荐阅读整本书,它也很有趣:)谢谢大家:)