O Elixir usa Behaviours no código para oferecer interfaces genéricas comuns e, ao mesmo tempo, permitir implementações específicas para cada módulo que os implementa. Um exemplo comum disso é o Access Behaviour.
O Access Behaviour oferece uma interface comum para recuperar dados de uma estrutura de dados baseada em chaves. Ele é implementado para mapas e listas de palavras-chave, mas vamos ver como ele é usado com mapas para você entender melhor. O Access Behaviour define que, quando você tem um mapa, pode escrever colchetes logo depois dele e usar a chave para recuperar 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, nil é retornado. Isso pode gerar comportamentos indesejados, porque nenhum erro é lançado. Repare que o próprio nil implementa o Access Behaviour e sempre retorna nil para qualquer chave.
Você faz parte de uma equipe de desenvolvimento web que mantém o site de um time de basquete local. A equipe conhece pouco de Elixir e está pedindo uma função capaz de extrair dados de uma série de mapas aninhados para facilitar o desenvolvimento rápido.
Implemente a função extract_from_path/2 para receber dois argumentos:
data: uma estrutura de mapas aninhados com dados sobre o time de basquete.path: uma string composta de chaves separadas por pontos, para obter o valor associado à última chave.Caso o valor ou a chave não exista em nenhum ponto do caminho, a função deve retornar 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
Use o Access Behaviour ao implementar essa função.
Não use nenhuma função dos módulos Map ou Kernel para trabalhar com a estrutura de mapas aninhados.
Um colega que revisa seu código comenta sobre uma função do módulo Kernel que faz algo muito parecido com a sua implementação.
Implemente get_in_path/2 usando 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"
Crie sua conta no Exercism para aprender e dominar Elixir com 58 conceitos168 exercícios e mentoria humana de verdade, tudo de graça.