(pretty new to Elixir here…)
sometimes I see:
case [...] do
{:ok, [...]} -> [...]
# using _ as default
{_, other} -> {:error, other}
end
other times:
case [...] do
{:ok, [...]} -> [...]
# not using _ as default
other -> {:error, other}
end
and other times:
case [...] do
{:ok, [...]} -> [...]
# using _xxx as default
_other -> :ok
end
Are these the same thing? If not what are the differences between them and considerations for use of one over the other?
Tyia.
Imagine that you have a value response
that could be a few things:
response = {:ok, result}
response = {:error, reason}
response = {:invalid, :other, :fields}
Then the cases would be:
# This would work for the first two cases returning result in the first one,
# {:error, other} for the second one and raise an exception for the third one (no match at all).
case response do
{:ok, result} -> result
{_, other} -> {:error, other}
end
# This would work for all the cases and return result for the first case,
# {:error, other} for the second case and
# {:error, {:invalid, :other, :fields}} for the third one
case response do
{:ok, result} -> result
other -> {:error, other}
end
# This would return result for the first case and :ok for any other response.
case response do
{:ok, result} -> result
_other -> :ok
end
Usually you will match a value that comes from a function and the clauses of the match will depend of the format of the result of that function.
2 Likes