Как я могу вызвать функцию модуля внутри 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?
Ответы
Ответ 1
Синтаксис для захвата неанонимных функций использует &function/arity
.
В вашем примере:
Enum.map([1,2,3,4], &Funcs.double/1)
Подробнее о синтаксисе захвата (который очень распространен в Elixir) можно прочитать в документах для специальной формы &
.