case é uma estrutura de controle de fluxo que nos permite comparar um determinado valor com vários padrões. As cláusulas de uma expressão case são avaliadas de cima para baixo, até que uma correspondência seja encontrada.
Em muitos casos, usar case é intercambiável com definir múltiplas cláusulas de função. É possível usar correspondência de padrões e guardas em cláusulas case.
# one function clause, multiple case clauses
def age_group(age) do
case age do
0 -> ~c"infant"
age when age < 4 -> ~c"baby"
age when age < 13 -> ~c"child"
age when age < 18 -> ~c"teenager"
_ -> ~c"adult"
end
end
# multiple function clauses, no case
def age_group(0), do: ~c"infant"
def age_group(age) when age < 4, do: ~c"baby"
def age_group(age) when age < 13, do: ~c"child"
def age_group(age) when age < 18, do: ~c"teenager"
def age_group(_), do: ~c"adult"
Não há regras rígidas para escolher uma em vez da outra. É uma questão de preferência pessoal que geralmente depende do contexto.