Elixir Agent元组返回

时间:2015-12-24 15:54:27

标签: 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

输出

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}

具有不同结果的简单函数

person = fn ( first, last ) -> {{:ok, first}, last} end

输出:

iex(13)> person.("John", "Doe")                                 
{{:ok, "John"}, "Doe"}

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

提前致谢!

1 个答案:

答案 0 :(得分:5)

来自Agent.get_and_update(agent, fun, timeout)文档here

  

在一次操作中获取并更新代理状态。

     

将函数fun发送给调用该函数的代理程序   通过代理状态。该函数必须返回一个带有两个元组的元组   元素,第一个是要返回的值(即获取值)和   第二个是新州。

这是因为Agent只是GenServer的特殊情况,必须返回响应和新状态。您可以查看Agent.Server here

的实施情况