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_number和initial_number是如何相互关联的,我的意思是在代码中没有我们说的那样的东西
current_number = initial_number
因为当我调用GenServer.call(some_process_id, :next_number)它时从100开始,例如,如果start_link的参数是100.如果我们在初始状态和current_number参数之间没有任何映射,Elixir如何理解它必须从100开始
一个目的init/1是建立一个内部状态GenServer.修改这个GenServer内部状态的唯一方法是通过call-ing,cast-ing或发送常规消息(然后由handle_info/2回调处理).
这些函数(分别为handle_call/3和handle_cast/2)将被调用,其GenServer内部状态作为函数参数的最后一个参数传入.
考虑一下场景:
GenServer数字100.call更具体的)GenServer- :next_number.handle_call(:next_number, _from, current_number)回调函数,current_number其初始值为100.{:reply, current_number,current_number+1},您应该理解为:( reply元组的第一个元素)表示它将回复调用者; 元组的第二个元素将是返回给调用者的值(在这种情况下,它将是数字100); 和元组的最后一个元素将是一个新的状态GenServer - current_number+1,所以101.:next_number call时GenServer,它将遵循前面的步骤,除了现在的内部状态101,并且从函数返回后,新状态将是102,等等...