Elixir’s Getting Started guides go over the &Module.function/arity
and &(...)
anonymous function shorthand, but there are a couple neat tricks that are not immediately apparent about this shorthand.
For example, you can do something like &"..."
.
iex> hello_fun = &"Hello, #{&1}"
iex> hello_fun.("Keita")
"Hello, Keita"
Let’s have some more fun.
iex> fun = &~r/hello #{&1}/
iex> fun.("world")
~r/hello world/
iex> fun = &~w(hello #{&1})
iex> fun.("world")
["hello", "world"]
iex> fun.("world moon mars")
["hello", "world", "moon", "mars"]
iex> fun = &if(&1, do: "ok", else: "not ok")
iex> fun.(true)
"ok"
iex> fun.(false)
"not ok"
You can even use defmodule
to create an anonymous function that defines a new module.
iex> fun = &defmodule(&1, do: def(hello, do: unquote(&2)))
iex> fun.(Hello, "hello there")
{:module, Hello, <<...>>, {:hello, 0}}
iex> Hello.hello
"hello there"
(Note that I don’t recommend overusing it like I did here! The only one that has been really useful to me was the first example, &"..."
)