Elixir favorisce le pratiche del principio Open-Closed permettendo alle funzioni di avere più clausole: invece di una logica di controllo dispersiva e codificata a mano, si possono scrivere funzioni mirate che aggiungono o rimuovono comportamenti con facilità.
Elixir offre le clausole multiple di funzione e le guardie per scrivere:
def number(n) when n == 7 do
"Awesome, that's my favorite"
end
def number(_n) do
"That's not my favorite"
end
In fase di esecuzione, Elixir verifica, dall'alto verso il basso del file sorgente, quale clausola di funzione chiamare.
Le variabili non utilizzate vanno precedute da un underscore.
Le guardie impediscono a Elixir di chiamare una funzione in base a come le funzioni di guardia valutano gli argomenti. Le guardie iniziano con la parola chiave when, seguita da un'espressione booleana. Le funzioni di guardia sono funzioni speciali che:
true o false.Un elenco delle guardie più comuni si trova nella documentazione di Elixir. Include controlli di tipo, aritmetica di base, confronti e operatori strettamente booleani.
Le funzioni possono dichiarare valori predefiniti per uno o più argomenti. Consideriamo questa funzione:
def number(n \\ 13), do: "That's not my favorite"
Al momento della compilazione, Elixir crea una definizione di funzione per number/0 (nessun argomento) e per number/1 (un argomento).
Se più di un argomento ha valori predefiniti, questi vengono applicati alla funzione da sinistra a destra per coprire gli argomenti mancanti.
Se la funzione ha più di una clausola, gli argomenti predefiniti vanno definiti in un'intestazione di funzione (una funzione senza corpo) prima delle clausole della funzione:
def number(n \\ 13)
def number(n) when n < 10, do: "Dream bigger!"
def number(n) when n > 100, do: "Not that big..."
Stai creando un semplice gioco online in cui un amico può indovinare un numero segreto. Vuoi dare un po' di feedback, ma senza rivelare la risposta con un tentativo. Devi ideare una funzione che fornisca risposte diverse a seconda di come il tentativo si rapporta al numero segreto.
| Condizione | Risposta |
|---|---|
| Quando il tentativo coincide con il numero segreto | "Correct" |
| Quando il tentativo è uno in più o uno in meno del numero segreto | "So close" |
| Quando il tentativo è maggiore del numero segreto | "Too high" |
| Quando il tentativo è minore del numero segreto | "Too low" |
| Quando non viene fatto alcun tentativo | "Make a guess" |
Tutti i tentativi e i numeri segreti sono numeri interi.
Implementa la funzione compare/2, che accetta due argomenti, secret_number e guess, entrambi numeri interi.
GuessingGame.compare(5, 5)
# => "Correct"
Modifica la funzione compare in modo che risponda ai tentativi più alti del numero segreto.
GuessingGame.compare(5, 8)
# => "Too high"
Modifica la funzione compare in modo che risponda ai tentativi più bassi del numero segreto.
GuessingGame.compare(5, 2)
# => "Too low"
Modifica la funzione compare in modo che risponda ai tentativi vicini al numero segreto.
GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"
Modifica la funzione compare in modo che risponda all'assenza di un tentativo.
GuessingGame.compare(5)
# => "Make a guess"
GuessingGame.compare(5, :no_guess)
# => "Make a guess"
Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.