En Elixir, un tuple est une structure de données qui organise des données et contient un nombre fixe d'éléments de n'importe quel type, sans nom explicite pour chacun d'eux. Les tuples sont souvent utilisés en Elixir pour les opérations gourmandes en lectures mémoire, car l'accès en lecture à un élément se fait en temps constant. On ne les utilise généralement pas quand des éléments doivent être ajoutés ou supprimés dynamiquement, car au lieu de modifier le tuple existant, un nouveau tuple est créé, ce qui nécessite d'allouer de la mémoire au préalable.
En pratique, on crée les tuples en Elixir avec des accolades. On peut accéder à chaque élément d'un tuple individuellement avec la fonction elem/2, en utilisant un indice commençant à 0 :
empty_tuple = {}
one_element_tuple = {1}
multiple_element_tuple = {1, :a, "hello"}
elem(multiple_element_tuple, 2)
# => "hello"
En pratique, on utilise souvent les tuples pour représenter un ensemble d'informations regroupées.
Float.ratio(0.25)
# => {1, 4} indicating the numerator and denominator of the fraction ¼
Le filtrage par motif domine dans le code Elixir idiomatique et assertif. Tu te souviens peut-être que =/2 est décrit comme un opérateur de correspondance plutôt que comme un opérateur d'affectation. Quand on utilise cet opérateur, si le motif de gauche correspond à la valeur de droite, les variables de gauche sont liées, et la valeur de droite est renvoyée. Une MatchError est levée s'il n'y a pas de correspondance.
2 = 2
# => 2
# Literals can be matched if they are the same
2 = 3
# => ** (MatchError) no match of right hand side value: 3
{_, denominator} = Float.ratio(0.25)
# => {1, 4}
# the variable `denominator` is bound to the value 4
Rappelle-toi que les correspondances vont de la droite vers la gauche.
Dans le dernier exemple, si une variable ne nous sert pas dans un filtrage par motif, on peut l'ignorer en utilisant _. Toute variable commençant par un _ n'est pas suivie par l'environnement d'exécution.
Le filtrage par motif est aussi un outil précieux quand on écrit plusieurs clauses de fonction. On peut l'utiliser sur les arguments de la fonction, ce qui détermine la clause à invoquer : on part du haut du fichier et on descend jusqu'à la première correspondance. Les variables peuvent être liées dans l'en-tête de la fonction et utilisées dans le corps de celle-ci.
defmodule Example do
def named_function(:a = variable_a) do
{variable_a, 1}
end
def named_function(:b = variable_b) do
{variable_b, 2}
end
end
Example.named_function(:a)
# => {:a, 1}
Example.named_function(:b)
# => {:b, 2}
Example.named_function(:c)
# => ** (FunctionClauseError) no function clause matching in Example.named_function/1
Pendant que tu prépares des cookies pour tes amis, tu t'aperçois que tu dois convertir certaines des mesures utilisées dans la recette. Comme tu ne connais que le système métrique, tu dois trouver un moyen de convertir les mesures de cuisine américaines courantes en millilitres (mL) pour te faciliter la vie.
Utilise ce tableau de conversion pour ta solution :
| Unité à convertir | volume | en millilitres (mL) |
|---|---|---|
| mL | 1 | 1 |
| tasse américaine | 1 | 240 |
| once liquide américaine | 1 | 30 |
| cuillère à café américaine | 1 | 5 |
| cuillère à soupe américaine | 1 | 15 |
En tant que programmeur talentueux en pleine formation, tu décides d'utiliser les millilitres comme unité de transition pour faciliter la conversion de n'importe quelle unité listée vers n'importe quelle autre (y compris vers elle-même).
Implémente la fonction KitchenCalculator.get_volume/1. Étant donné un tuple de volume, elle doit renvoyer uniquement la composante numérique.
KitchenCalculator.get_volume({:cup, 2.0})
# => 2.0
Implémente la fonction KitchenCalculator.to_milliliter/1. Étant donné un tuple de volume, elle doit convertir le volume en millilitres à l'aide du tableau de conversion.
Utilise plusieurs clauses de fonction et le filtrage par motif pour créer les fonctions de chaque unité. Les atomes utilisés pour désigner chaque unité sont : :cup, :fluid_ounce, :teaspoon, :tablespoon, :milliliter. Renvoie le résultat de la conversion encapsulé dans un tuple.
KitchenCalculator.to_milliliter({:cup, 2.5})
# => {:milliliter, 600.0}
Implémente la fonction KitchenCalculator.from_milliliter/2. Étant donné un tuple de volume et l'unité souhaitée, elle doit convertir le volume vers l'unité souhaitée à l'aide du tableau de conversion.
Utilise plusieurs clauses de fonction et le filtrage par motif pour créer les fonctions de chaque unité. Les atomes utilisés pour désigner chaque unité sont : :cup, :fluid_ounce, :teaspoon, :tablespoon, :milliliter
KitchenCalculator.from_milliliter({:milliliter, 1320.0}, :cup)
# => {:cup, 5.5}
Implémente la fonction KitchenCalculator.convert/2. Étant donné un tuple de volume et l'unité souhaitée, elle doit convertir le volume donné vers l'unité souhaitée.
KitchenCalculator.convert({:teaspoon, 9.0}, :tablespoon)
# => {:tablespoon, 3.0}
Inscris-toi sur Exercism pour apprendre et maîtriser Elixir avec 58 concepts168 exercices, et un vrai mentorat humain, le tout gratuitement.