Erlang - Guardie

Le guardie sono costrutti che possiamo usare per aumentare la potenza del pattern matching. Utilizzando guards, possiamo eseguire semplici test e confronti sulle variabili in un pattern.

La sintassi generale dell'istruzione guard è la seguente:

function(parameter) when condition ->

Dove,

  • Function(parameter) - Questa è la dichiarazione di funzione utilizzata nella condizione di guardia.

  • Parameter - Generalmente la condizione di guardia si basa sul parametro.

  • Condition - La condizione che dovrebbe essere valutata per vedere se la funzione deve essere eseguita o meno.

  • L'istruzione when deve essere utilizzata quando viene specificata una condizione di guardia.

Diamo un'occhiata a un rapido esempio di come possono essere utilizzate le guardie:

Esempio

-module(helloworld). 
-export([display/1,start/0]). 

display(N) when N > 10 ->   
   io:fwrite("greater then 10"); 
display(N) when N < 10 -> io:fwrite("Less 
   than 10"). 

start() -> 
   display(11).

Le seguenti cose devono essere annotate sull'esempio sopra:

  • La funzione di visualizzazione è definita insieme a una guardia. La prima dichiarazione di visualizzazione ha una guardia di quando il parametro N è maggiore di 10. Quindi se il parametro è maggiore di 10, verrà chiamata quella funzione.

  • La funzione di visualizzazione viene definita nuovamente, ma questa volta con la guardia inferiore a 10. In questo modo è possibile definire la stessa funzione più volte, ciascuna con una condizione di guardia separata.

L'output del programma di cui sopra sarà il seguente:

Produzione

greater than 10

Le condizioni di guardia possono essere utilizzate anche per if else e casedichiarazioni. Vediamo come possiamo svolgere le operazioni di guardia su queste dichiarazioni.

Protezioni per dichiarazioni "if"

Le protezioni possono essere utilizzate anche per le istruzioni if ​​in modo che la serie di istruzioni eseguite sia basata sulla condizione guard. Vediamo come possiamo ottenere questo risultato.

Esempio

-module(helloworld). 
-export([start/0]). 

start() -> 
   N = 9, 
   if 
      N > 10 -> 
         io:fwrite("N is greater than 10"); 
      true -> 
         io:fwrite("N is less than 10") 
   end.

Le seguenti cose devono essere annotate sull'esempio sopra:

  • La funzione guard viene utilizzata insieme all'istruzione if. Se la funzione guardia restituisce true, viene visualizzata l'istruzione "N è maggiore di 10".

  • Se la funzione di guardia restituisce false, viene visualizzata l'istruzione "N è inferiore a 10".

L'output del programma di cui sopra sarà il seguente:

Produzione

N is less than 10

Guardie per dichiarazioni "caso"

Le protezioni possono essere utilizzate anche per le istruzioni case in modo che la serie di istruzioni eseguite sia basata sulla condizione guard. Vediamo come possiamo ottenere questo risultato.

Esempio

-module(helloworld). 
-export([start/0]). 

start() -> 
   A = 9, 
   case A of {A} when A>10 -> 
      io:fwrite("The value of A is greater than 10"); _ -> 
      io:fwrite("The value of A is less than 10") 
   end.

Le seguenti cose devono essere annotate sull'esempio sopra:

  • La funzione guard viene utilizzata insieme all'istruzione case. Se la funzione di guardia restituisce true, viene visualizzata l'istruzione "Il valore di A è maggiore di 10".

  • Se la funzione guardia restituisce qualcos'altro, viene visualizzata l'istruzione "Il valore di A è inferiore a 10".

L'output del programma di cui sopra sarà il seguente:

Produzione

The value of A is less than 10

Condizioni di protezione multipla

È inoltre possibile specificare più condizioni di guardia per una funzione. La sintassi generale dell'istruzione guard con più condizioni di guardia è fornita di seguito:

function(parameter) when condition1 , condition1 , .. conditionN ->

Dove,

  • Function(parameter) - Questa è la dichiarazione di funzione che ha utilizzato la condizione di guardia.

  • Parameter - Generalmente la condizione di guardia si basa sul parametro.

  • condition1, condition1, .. conditionN - Queste sono le condizioni di protezione multipla applicate alle funzioni.

  • L'istruzione when deve essere utilizzata quando viene specificata una condizione di guardia.

Diamo un'occhiata a un rapido esempio di come possono essere utilizzate più guardie:

Esempio

-module(helloworld). 
-export([display/1,start/0]). 

display(N) when N > 10 , is_integer(N) -> 
   io:fwrite("greater then 10"); 
display(N) when N < 10 -> 
   io:fwrite("Less than 10"). 
   
start() -> 
   display(11).

Il punto seguente deve essere notato riguardo all'esempio precedente:

  • Noterai che per la prima dichiarazione della funzione di visualizzazione, oltre alla condizione per N> 10, la condizione per is_integerè anche specificato. Quindi solo se il valore di N è un numero intero e maggiore di 10, questa funzione verrà eseguita.

L'output del programma di cui sopra sarà il seguente:

Produzione

Greater than 10