Sanjibukai
Returning a constant with an anonymous function with the capture operator &
Hello,
You may be already using the Capture Operator & for capturing functions or quickly creating anonymous function.
For this later case, you may also know that it’s not possible to use it for creating an anonymous function that return a constant or a literal or in other words without using a placeholder in the capture expression as explained in the doc:
The only restrictions when creating anonymous functions is that at least one placeholder must be present, i.e. it must contain at least
&1, and that block expressions are not supported:
# No placeholder, fails to compile.
&(:foo)
# Block expression, fails to compile.
&(&1; &2)
However it might be useful sometimes to return an atom or a constant or any literal.
Well you can bypass the parameter using || (the or operator):
&(:foo || &1)
&(true || &1)
&(42 || &1)
And if you want to return no matter what false or nil, well you can do it too, just use && (the and operator):
&(false || &1)
&(nil || &1)
Have a good day everyone..
Most Liked
axelson
For others reading I wanted to note that fn _ -> :foo is the equivalent of &(:foo || &1) (not fn -> :foo). Depending on how you’re using the anonymous function the different arities could make a significant difference. There is no way to create a 0-arity anonymous function using the & capture syntax.
lucaong
If I understand correctly, it’s a trick to use the capture operator even when one does not want to use any of the placeholders, so it is intentional that &1 is never used. It is there just because otherwise the anonymous function would not compile.
If on one hand I like the creative thinking around that, I would avoid this as it is confusing. As already stated, fn -> :foo end is much clearer and almost as short.
More generally, after an initial enthusiasm, I switched to almost never use the capture operator for anonymous functions. I find fn -> ... end a lot clearer, and saving a few characters not worth. On the other hand, I find the capture operator for named functions (like &Module.function/3) very useful.
lkuty
Why not but I think that, most of the time, if I have to write &(:foo || &1), I might as well write fn -> :foo end. Maybe in some syntactic context, &(...) is more readable than fn -> ... end. I don’t know, I guess it depends on the use case. Anyway, thanks for sharing.
Last Post!
lkuty
Popular in Discussions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex









