Подтвердить что ты не робот

Как я могу вызвать функцию модуля внутри Enum.map без получения ошибки "Undefined reference"?

У меня есть простой модуль, содержащий одну функцию:

defmodule Funcs do

  def double(x) do
    x*2
  end

end

Когда я начинаю iex с именем файла в качестве аргумента, я могу вызвать функцию просто отлично:

iex(5)> Funcs.double(3)
6

Но когда я пытаюсь использовать его в Enum.map, я получаю ошибку undefined function:

iex(2)> Enum.map([1,2,3,4], Funcs.double)
** (UndefinedFunctionError) undefined function: Funcs.double/0
    Funcs.double()

тогда как если я просто использую аналогичную анонимную функцию, все работает так, как ожидалось:

iex(6)> Enum.map([1,2,3,4], fn(x) -> x*2; end)
[2, 4, 6, 8]

Как я могу использовать функцию модуля (неуверенный, правильный ли термин) в качестве аргумента для Enum.map?

4b9b3361

Ответ 1

Синтаксис для захвата неанонимных функций использует &function/arity.

В вашем примере:

Enum.map([1,2,3,4], &Funcs.double/1)

Подробнее о синтаксисе захвата (который очень распространен в Elixir) можно прочитать в документах для специальной формы &.