Elixir Agent元组返回

ini*_*nic 0 elixir

我正在研究以下教程

https://howistart.org/posts/elixir/1

我正在与代理商合作,我不明白这条线是如何工作的.

def pop(door) do
    Agent.get_and_update(door, fn
        []      -> {:error, []}
        [h|t]   -> {{:ok, h}, t}     ## returns {:ok, h} why not {{:ok, h}, t}
    end  )
end
Run Code Online (Sandbox Code Playgroud)

产量

iex(5)> Portal.Door.push(:pink, 2)
:ok
iex(6)> Portal.Door.push(:pink, 3)
:ok
iex(7)> Portal.Door.push(:pink, 4)
:ok
iex(8)> Portal.Door.pop(:pink)    
{:ok, 4}
Run Code Online (Sandbox Code Playgroud)

具有不同结果的简单函数

person = fn ( first, last ) -> {{:ok, first}, last} end
Run Code Online (Sandbox Code Playgroud)

输出:

iex(13)> person.("John", "Doe")                                 
{{:ok, "John"}, "Doe"}
Run Code Online (Sandbox Code Playgroud)

为什么一个返回内部元组和外部元组,代理只返回内部元组.

提前致谢!

AbM*_*AbM 5

这里的Agent.get_and_update(agent, fun, timeout)文档:

在一个操作中获取并更新代理状态.

函数fun被发送到代理,代理调用传递代理状态的函数.该函数必须返回一个包含两个元素的元组,第一个是要返回的值(即获取值),第二个是新状态.

这是因为Agent只是一个GenServer必须返回响应和新状态的特殊情况.你可以查看这里的实现Agent.Server