Каковы некоторые особенности использования функции make_ref () в эликсире? - PullRequest
0 голосов
/ 11 июня 2018

Я видел фрагмент кода, использующий 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 голосов
/ 14 июня 2018

Я видел, что он используется как флаг "уникальности" при отправке сообщений.

См. этот пример из 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 используется для отправки сообщения, которое может быть получено только процессом, зная ссылку.Это относительно простой способ ограничить процессное взаимодействие определенной областью.

Кроме этого ответа мудасобвы, безусловно, является правильным.

0 голосов
/ 11 июня 2018

:erlang.make_ref/0 возвращает ссылку, которая уникальна для подключенных узлов .

В основном это наследие эпохи, предшествовавшей UUID.Тем не менее, просто генератор случайных чисел не будет достаточно: он должен сгенерировать что-то уникальное на разных машинах .

UUID может быть хорошей альтернативой для ссылок, если вы не обеспокоенызагрузка памяти: ссылки намного эффективнее .

Кроме того, вызов make_ref [возможно] удобнее, чем работа с своего рода генератором UUID.

...