我看到了一段使用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>
答案 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的答案当然是正确的。