elixir中make_ref()函数有哪些用法?

时间:2018-06-11 14:16:13

标签: elixir

我看到了一段使用make_ref()的代码段,并且不确定此功能的可用性。

hexdocs说:

  

返回一个几乎唯一的引用。

     

返回的引用将在大约2 ^ 82次调用后重新发生;   因此它具有足够的实用性。

     

由编译器内联。

但它并没有真正说明何时或为何我应该使用它。我为什么要使用它,何时使用它?在我看来,它所做的就是产生随机数。为什么我不能使用某种随机数生成器?

这就是它在终端上的作用:

iex(1)> make_ref()
#Reference<0.3569050097.3772514305.191818>
iex(2)> make_ref()
#Reference<0.3569050097.3772514305.191837>
iex(3)> make_ref()
#Reference<0.3569050097.3772514307.194286>

2 个答案:

答案 0 :(得分:3)

:erlang.make_ref/0会返回在连接节点中唯一的引用

这主要是UUID之前的遗产。也就是说,只是随机生成器还不够:它应该在不同的机器上生成唯一的东西

UUID可能是引用的一个很好的替代方法,除非你担心内存负载:引用是way more efficient

此外,调用make_ref [可能]比处理有点UUID生成器更容易。

答案 1 :(得分:0)

我已经看到它被用作&#34;唯一性&#34;发送消息时标记。

请参阅this example from db_connection

def run_child(mod, fun, state, opts) do
  ref = make_ref()
  arg = [mod, fun, ref, self(), state, opts]
  {:ok, pid} = Task.Supervisor.start_child(__MODULE__, __MODULE__, :init, arg)
  mon = Process.monitor(pid)
  send(pid, {:go, ref, mon})
  {pid, mon}
end

def init(mod, fun, ref, conn, state, opts) do
  # ...
  receive do
    {:go, ^ref, mon} ->
      # ...
  end
end

此处make_ref/0用于发送消息,该消息只能由知道该引用的进程接收。这是一种将流程沟通限制在特定范围内的相对简单的方法。

除了mudasobwa的答案当然是正确的。