Parcours
/
Elixir
Elixir
/
Exercices
/
Calculatrice de cuisine
Calculatrice de cuisine

Calculatrice de cuisine

Exercice d'apprentissage

Introduction

Tuples

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"

Les tuples comme regroupement d'informations

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 ¼

Filtrage par motif

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 dans les fonctions nommées

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

Instructions

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).

1. Récupère la composante numérique d'une paire de volumes

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

2. Convertis la paire de volumes en millilitres

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}

3. Convertis la paire de volumes en millilitres vers une autre unité

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}

4. Convertis n'importe quelle unité vers n'importe quelle autre

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}
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Elixir Exercism

Prêt à commencer Calculatrice de cuisine ?

Inscris-toi sur Exercism pour apprendre et maîtriser Elixir avec 58 concepts168 exercices, et un vrai mentorat humain, le tout gratuitement.