Elixir facilite la mise en œuvre du principe ouvert/fermé en permettant aux fonctions d'avoir plusieurs clauses. Ainsi, au lieu d'étaler une logique de contrôle « en dur », c'est-à-dire une logique qui fige les valeurs dans le code plutôt que de les rendre modifiables à tout moment, on peut écrire des fonctions ciblées auxquelles il est facile d'ajouter ou de retirer un comportement.
Elixir propose les clauses de fonction multiples et les gardes pour écrire :
def number(n) when n == 7 do
"Awesome, that's my favorite"
end
def number(_n) do
"That's not my favorite"
end
À l'exécution, Elixir teste, du haut vers le bas du fichier source, la clause de fonction à invoquer.
Les variables inutilisées doivent être préfixées par un underscore.
Les gardes servent à empêcher Elixir d'appeler une fonction selon le résultat de l'évaluation des arguments par les fonctions de garde. Une garde commence par le mot-clé when, suivi d'une expression booléenne. Les fonctions de garde sont des fonctions spéciales qui :
true ou false.Tu trouveras une liste des gardes courantes dans la documentation d'Elixir. Elle comprend des vérifications de type, de l'arithmétique de base, des comparaisons et des opérateurs strictement booléens.
Les fonctions peuvent déclarer des valeurs par défaut pour un ou plusieurs arguments. Prenons cette fonction :
def number(n \\ 13), do: "That's not my favorite"
À la compilation, Elixir crée une définition de fonction pour number/0 (sans argument) et number/1 (avec un argument).
Si plusieurs arguments ont des valeurs par défaut, celles-ci sont appliquées à la fonction de gauche à droite pour combler les arguments manquants.
Si la fonction comporte plusieurs clauses, les arguments par défaut doivent être définis dans un en-tête de fonction (une fonction sans corps) avant les clauses de la fonction :
def number(n \\ 13)
def number(n) when n < 10, do: "Dream bigger!"
def number(n) when n > 100, do: "Not that big..."
Tu crées un petit jeu en ligne où un ami doit deviner un nombre secret. Tu veux lui donner un retour, mais sans dévoiler la réponse à travers une proposition. Tu dois donc concevoir une fonction qui produit des réponses différentes selon la façon dont la proposition se situe par rapport au nombre secret.
| Condition | Réponse |
|---|---|
| Quand la proposition correspond au nombre secret | "Correct" |
| Quand la proposition vaut un de plus ou un de moins que le nombre secret | "So close" |
| Quand la proposition est supérieure au nombre secret | "Too high" |
| Quand la proposition est inférieure au nombre secret | "Too low" |
| Quand aucune proposition n'est faite | "Make a guess" |
Toutes les propositions et tous les nombres secrets sont des nombres entiers.
Implémente la fonction compare/2 qui prend deux arguments, secret_number et guess, tous deux des nombres entiers.
GuessingGame.compare(5, 5)
# => "Correct"
Modifie la fonction compare pour qu'elle réponde aux propositions supérieures au nombre secret.
GuessingGame.compare(5, 8)
# => "Too high"
Modifie la fonction compare pour qu'elle réponde aux propositions inférieures au nombre secret.
GuessingGame.compare(5, 2)
# => "Too low"
Modifie la fonction compare pour qu'elle réponde aux propositions proches du nombre secret.
GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"
Modifie la fonction compare pour qu'elle réponde à l'absence de proposition.
GuessingGame.compare(5)
# => "Make a guess"
GuessingGame.compare(5, :no_guess)
# => "Make a guess"
Inscris-toi sur Exercism pour apprendre et maîtriser Elixir avec 58 concepts168 exercices, et un vrai mentorat humain, le tout gratuitement.