Elixir了解GenServer

Tan*_*ano 0 erlang functional-programming elixir erlang-otp gen-server

我是Elixir的新手,正在阅读一本书并做一些例子.这是让我在这里提问的一段代码:

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
Run Code Online (Sandbox Code Playgroud)

据我所知,在初始化服务器时调用init函数,我们正在定义一些参数 - 这将是服务器的初始状态.令我困惑的是,current_numberinitial_number是如何相互关联的,我的意思是在代码中没有我们说的那样的东西

current_number = initial_number

因为当我调用GenServer.call(some_process_id, :next_number)它时从100开始,例如,如果start_link的参数是100.如果我们在初始状态和current_number参数之间没有任何映射,Elixir如何理解它必须从100开始

Paw*_*zak 7

一个目的init/1建立一个内部状态GenServer.修改这个GenServer内部状态的唯一方法是通过call-ing,cast-ing或发送常规消息(然后由handle_info/2回调处理).

这些函数(分别为handle_call/3handle_cast/2)将被调用,其GenServer内部状态作为函数参数的最后一个参数传入.

考虑一下场景:

  1. 你正在初始化GenServer数字100.
  2. 你发送一条消息(一个call更具体的)GenServer- :next_number.
  3. 这将调用您的handle_call(:next_number, _from, current_number)回调函数,current_number其初始值为100.
  4. 作为此函数的返回值,您指定了元组:{:reply, current_number,current_number+1},您应该理解为:( reply元组的第一个元素)表示它将回复调用者; 元组的第二个元素将是返回给调用者的值(在这种情况下,它将是数字100); 和元组的最后一个元素将是一个新的状态GenServer - current_number+1,所以101.
  5. 当你向另一个发送另一个:next_number callGenServer,它将遵循前面的步骤,除了现在的内部状态101,并且从函数返回后,新状态将是102,等等...