Percursos
/
Elixir
Elixir
/
Exercícios
/
Site de basquetebol
Site de basquetebol

Site de basquetebol

Exercício de aprendizagem

Introdução

Access Behaviour

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.

Instruções

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.

1. Extrair dados de uma estrutura de mapas aninhados

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.

2. Refatorar com as funções incluídas

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"
Editar via GitHub A ligação abre numa nova janela ou separador
Elixir Exercism

Estás pronto para começar Site de basquetebol?

Inscreve-te no Exercism para aprenderes e dominares Elixir com 58 conceitos168 exercícios, e mentoria humana real, tudo grátis.