28 февраля 2017 г.

Написание коротких вспомогательных функций в Elixir является естественным поведением, поскольку Elixir - это функциональный язык программирования, и, к счастью, Elixir предоставляет ярлык для экономии времени: оператор &.

Создание анонимных функций быстрого доступа

Прежде чем мы получим некоторые объяснения, давайте посмотрим, как выглядит написание ярлыков анонимных функций.

fn x -> x + 1 end is same as &(&1 + 1) 
fn x -> x + x end is same as &(&1 + &1)
fn x, y -> x + y end is same as &(&1 + &2)

Теперь происходит то, что оператор & преобразует выражение в круглых скобках в анонимную функцию, где & 1, & 2 и т. Д. Соответствуют параметрам, данным функции. Итак, &(IO.puts &1 <> " " <> &2) эквивалентно fn hello, world -> IO.puts hello <> " " <> world end.. Посмотрите на длину каждой версии и судите сами.

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

Например, мы хотим получить каждый атом из следующего списка [19, :elixir, 77, :phoenix, 64, {:one, "one"}, :erlang], возвращенный в виде строки.

list = [19, :elixir, 77, :phoenix, 64, {:one, "one"}, :erlang]
list 
|> Enum.filter(&(is_atom(&1))) 
|> Enum.map(&(to_string(&1)))

При запуске приведенный выше код выводит: ["elixir", "phoenix", "erlang"], что в точности соответствует нашим ожиданиям.

Захват именованной функции

Еще одна особенность оператора & - захват именованных функций. Среднее значение захвата & может превратить именованную функцию в анонимную функцию.
Затем приведенный выше пример можно было бы реорганизовать с захватом is_atom и to_string следующим образом:

list = [19, :elixir, 77, :phoenix, 64, {:one, "one"}, :erlang]
list 
|> Enum.filter(&is_atom/1) 
|> Enum.map(&to_string/1)

И результат остается прежним.
Это оптимизация, поскольку вместо создания анонимной функции и выделения новой памяти Elixir поддерживает прямую ссылку на исходную функцию. Надеюсь, вы найдете это полезным, и теперь, когда вы его освоили и сэкономите свое драгоценное время.

Первоначально опубликовано на сайте prima.engineering 28 февраля 2017 г.