O Elixir recorre a Behaviours no código para disponibilizar interfaces genéricas comuns e, ao mesmo tempo, facilitar implementações específicas para cada módulo que os implementa. Um desses exemplos comuns é o Access Behaviour.
O Access Behaviour disponibiliza uma interface comum para obter dados de uma estrutura de dados baseada em chaves. O Access Behaviour está implementado para mapas e listas de palavras-chave, mas vamos ver como se usa com mapas para perceberes melhor como funciona. O Access Behaviour determina que, quando tens um mapa, podes escrever a seguir a ele parênteses retos e usar a chave para obter o valor associado a essa chave.
# Suppose we have these two maps defined (note the difference in the key type)
my_map = %{key: "my value"}
your_map = %{"key" => "your value"}
# Obtain the value using the Access Behaviour
my_map[:key] == "my value"
your_map[:key] == nil
your_map["key"] == "your value"
Se a chave não existir na estrutura de dados, é devolvido nil. Isto pode dar origem a comportamento indesejado, porque não lança um erro. Repara que o próprio nil implementa o Access Behaviour e devolve sempre nil para qualquer chave.
Estás a trabalhar com uma equipa de desenvolvimento web para manter o site de uma equipa local de basquetebol. A equipa de desenvolvimento web conhece pouco o Elixir e pede uma função que permita extrair dados de uma série de mapas aninhados, para facilitar um desenvolvimento rápido.
Implementa a função extract_from_path/2, que recebe dois argumentos:
data: uma estrutura de mapas aninhados com dados sobre a equipa de basquetebol.path: uma string composta por chaves separadas por pontos que permitem obter o valor associado à última chave.Se o valor ou a chave não existir em nenhum ponto do caminho, deve ser devolvido nil.
data = %{
"team_mascot" => %{
"animal" => "bear",
"actor" => %{
"first_name" => "Noel"
}
}
}
BasketballWebsite.extract_from_path(data, "team_mascot.animal")
# => "bear"
BasketballWebsite.extract_from_path(data, "team_mascot.colors")
# => nil
Usa o Access Behaviour ao implementar esta função.
Não uses nenhuma função dos módulos Map ou Kernel para trabalhar com a estrutura de mapas aninhados.
Um colega que está a rever o teu código fala-te de uma função do módulo Kernel que faz algo muito semelhante à tua implementação.
Implementa a função get_in_path/2 para usar essa função do módulo Kernel.
Os argumentos esperados são os mesmos da parte 1.
BasketballWebsite.get_in_path(data, "team_mascot.actor.first_name")
# => "Noel"
Inscreve-te no Exercism para aprenderes e dominares Elixir com 58 conceitos168 exercícios, e mentoria humana real, tudo grátis.