Usare la logica condizionale per creare più percorsi di esecuzione

Completato

Si supponga di avere un programma che crea un file di backup in base ai file in una cartella. Il programma è costituito da poche righe di codice che individuano e comprimono un set di file. Che cosa succede se si decide di aggiungere logica per la creazione di un file di backup solo se nel giorno specifico non è stato eseguito alcun backup? Il programma avrebbe bisogno di un modo per verificare la condizione (è già stato eseguito un backup?) e quindi eseguire un'operazione diversa a seconda che la condizione sia o meno vera (se esiste un file di backup per il giorno specifico, non eseguire il backup).

Creare un ramo di codice usando un costrutto if

Un costrutto if valuta un'espressione booleana. Se l'espressione restituisce true, il programma esegue un ramo di codice particolare. Ecco un esempio della sintassi di un costrutto if:

if <condition> then <expression>

Un esempio di codice più tangibile è simile al seguente:

let age = 66
if age > 65 
then printfn "Senior citizen"

Definire un ramo alternativo usando una clausola else

Quando un'istruzione if restituisce false, usare una clausola else con il costrutto if per eseguire un ramo di codice diverso.

Ecco come usare una clausola else:

let age = 66
if age > 65 
then printfn "Senior citizen"
else printfn "Citizen"

Usare un costrutto if come espressione

Finora è stato mostrato come usare if e else per creare rami diversi nel codice. Quando il codice segue rami diversi, produce risultati diversi a seconda che una condizione booleana restituisca true o false. Quello che può non essere ovvio è che quando viene eseguita un'espressione, viene prodotto un valore.

Se il codice è scritto come in questo esempio, il risultato diventa chiaro:

let age = 64
let message = if age > 65 then "Senior citizen" else "Citizen"
printfn "%s" message

In questo caso, if e else funzionano più come un'espressione ternaria. Se una condizione è true, restituisce un valore. Se è false, restituisce l'altro valore. In entrambi i casi viene restituito un valore. E questo vale per tutte le espressioni if.

Si esaminerà adesso un esempio di codice precedente per analizzarlo in dettaglio:

let age = 66
if age > 65 then printfn "Senior citizen" else printfn "Citizen"

Si tratta dello stesso esempio di codice mostrato in precedenza, ma ora if e else si trovano sulla stessa riga. Dal momento che le azioni importanti dell'operazione printf si verificano nella funzione, quest'ultima non deve restituire un valore effettivo. Pertanto, il valore restituito dell'espressione printfn "Senior citizen" produce un valore di tipo unit.

Nota

unit è un valore che funge da segnaposto quando non viene restituito alcun valore effettivo. È possibile immaginarlo come void o None.

Un altro aspetto da tenere presente è che non è possibile combinare tipi. if e else devono restituire lo stesso tipo di dati o si riceverà un errore. Ad esempio, non è possibile scrivere codice simile a questo esempio:

let someCondition = true
let value = if someCondition then "hello" else 1 // not allowed

In questo caso, if determina che il tipo restituito è string e di conseguenza else non può modificare il tipo in int. Affinché il codice precedente funzioni, è necessario modificarlo:

let someCondition = true
let value = if someCondition then "hello" else "1" // allowed

Usare un costrutto elif

Finora è stato osservato il funzionamento di if e else. elif è un altro costrutto che è possibile usare in modo simile a if. Proprio come per un costrutto if, il costrutto elif accetta un valore booleano e deve essere aggiunto subito dopo if. Viene eseguito il costrutto elif quando per la condizione if viene restituito false. Ecco un esempio di come usare elif:

let cardValue = 1
let cardDescription = if cardValue = 1 then "Ace" elif cardValue = 14 then "Ace" else "A card"
printfn "%s" cardDescription