beno
Pattern match with multiple match options
I will often find my self writing things similar to:
case some_value do
nil -> something()
"" -> something()
_ -> something_else()
end
So in other words I have multiple match clauses that resolve to the same outcome. I makes me want to write something like:
case some_value do
nil | "" -> something()
_ -> something_else()
end
Of course in this case you’d probably turn the clauses around, but that is usually not desirable or in sync with my thinking about the problem. I can think of other solutions as well, but what is the most Elixiry way of tackling this?
Most Liked
OvermindDL1
To be specific, the right argument of the in/not in operator must be statically known at compile-time when used in guard position, so you cannot do something like:
l = [1, 2, 3]
case 2 do
b when b in l -> b # Fails compile with an ArgumentError
_ -> nil
end
This is because in guard position the in operator works differently than in non-guard position (I really dislike inconsistencies like this), specifically it gets expanded, so the above example when written like:
case 2 do
b when b in [1,2,3] -> b
_ -> nil
end
Actually gets compiled to (you can check with a core erlang dump):
case 2 do
b when b == 1 -> b
b when b == 2 -> b
b when b == 3 -> b
_ -> nil
EDIT: It also works with ranges:
case 2 do
b when b in 1..3 -> b
_ -> nil
end
Gets turned into:
case 2 do
b when b >= 1 and b<=3 -> b
_ -> nil
end
net
benwilson512
I think your overall point is good but this is in fact false, both in matches and in the general case:
iex(1)> match?(x when x in [1.0], 1)
false
iex(2)> 1 in [1.0]
false
Popular in Questions
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
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









