Elixir utilise des comportements pour fournir des interfaces génériques communes, tout en permettant des implémentations spécifiques pour chaque module qui l'implémente. Un exemple courant est le comportement Access.
Le comportement Access fournit une interface commune pour récupérer des données dans une structure de données basée sur des clés. Le comportement Access est implémenté pour les maps et les listes de mots-clés, mais regardons son utilisation avec les maps pour nous familiariser. Le comportement Access spécifie que lorsqu'on a une map, on peut la faire suivre de crochets, puis utiliser la clé pour récupérer la valeur associée à cette clé.
# 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"
Si la clé n'existe pas dans la structure de données, nil est renvoyé. Cela peut être une source de comportement inattendu, car cela ne lève pas d'erreur. Note que nil implémente lui-même le comportement Access et renvoie toujours nil pour n'importe quelle clé.
Tu travailles avec une équipe de développement web pour maintenir le site web d'une équipe locale de basket-ball. L'équipe de développement web connaît moins bien Elixir et te demande une fonction capable d'extraire des données d'une série de maps imbriquées, afin de faciliter un développement rapide.
Implémente la fonction extract_from_path/2 qui prend deux arguments :
data : une structure de maps imbriquées contenant des données sur l'équipe de basket-ball.path : une string composée de clés séparées par des points, qui permet d'obtenir la valeur associée à la dernière clé.Si la valeur ou la clé n'existe à aucun moment du chemin, la fonction doit renvoyer 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
Utilise l'Access Behaviour pour implémenter cette fonction.
N'utilise aucune fonction des modules Map ou Kernel pour manipuler la structure de maps imbriquées.
En relisant ton code, une personne de ton équipe te parle d'une fonction du module Kernel qui fait quelque chose de très similaire à ton implémentation.
Implémente get_in_path/2 en utilisant cette fonction du module Kernel.
Les arguments attendus sont les mêmes que dans la partie 1.
BasketballWebsite.get_in_path(data, "team_mascot.actor.first_name")
# => "Noel"
Inscris-toi sur Exercism pour apprendre et maîtriser Elixir avec 58 concepts168 exercices, et un vrai mentorat humain, le tout gratuitement.