Trilhas
/
Elixir
Elixir
/
Exercícios
/
Site de basquete
Site de basquete

Site de basquete

Exercício de aprendizagem

Introdução

Access Behaviour

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.

Instruções

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.

1. Extrair dados de uma estrutura de mapas aninhados

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.

2. Refatore usando funções incluídas

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"
Editar via GitHub O link abre em uma nova janela ou aba
Elixir Exercism

Tudo pronto para começar Site de basquete?

Crie sua conta no Exercism para aprender e dominar Elixir com 58 conceitos168 exercícios e mentoria humana de verdade, tudo de graça.