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 г.