Erlang - Guardas

Guardas são construções que podemos usar para aumentar o poder de correspondência de padrões. Usando guardas, podemos realizar testes simples e comparações nas variáveis ​​em um padrão.

A sintaxe geral da instrução guard é a seguinte -

function(parameter) when condition ->

Onde,

  • Function(parameter) - Esta é a declaração de função usada na condição de guarda.

  • Parameter - Geralmente, a condição de guarda é baseada no parâmetro.

  • Condition - A condição que deve ser avaliada para ver se a função deve ser executada ou não.

  • A instrução quando deve ser usada quando uma condição de guarda é especificada.

Vejamos um exemplo rápido de como os protetores podem ser usados ​​-

Exemplo

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

As seguintes coisas precisam ser observadas sobre o exemplo acima -

  • A função de exibição é definida junto com um guarda. A primeira declaração de exibição tem uma guarda de quando o parâmetro N é maior que 10. Portanto, se o parâmetro for maior que 10, essa função será chamada.

  • A função de exibição é definida novamente, mas desta vez com a guarda de menos de 10. Desta forma, você pode definir a mesma função várias vezes, cada uma com uma condição de guarda separada.

O resultado do programa acima será o seguinte -

Resultado

greater than 10

As condições de guarda também podem ser usadas para if else e caseafirmações. Vamos ver como podemos realizar as operações de guarda nessas declarações.

Protetores para declarações 'if'

Guardas também podem ser usados ​​para instruções if, de forma que a série de instruções executadas seja baseada na condição de guarda. Vamos ver como podemos conseguir isso.

Exemplo

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

As seguintes coisas precisam ser observadas sobre o exemplo acima -

  • A função guard é usada junto com a instrução if. Se a função de guarda for avaliada como verdadeira, a declaração “N é maior que 10” será exibida.

  • Se a função de guarda for avaliada como falsa, a declaração “N é menor que 10” é exibida.

O resultado do programa acima será o seguinte -

Resultado

N is less than 10

Guardas para declarações de 'caso'

Guardas também podem ser usados ​​para declarações de caso, de forma que a série de declarações executadas seja baseada na condição de guarda. Vamos ver como podemos conseguir isso.

Exemplo

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

As seguintes coisas precisam ser observadas sobre o exemplo acima -

  • A função de guarda é usada junto com a instrução case. Se a função de guarda for avaliada como verdadeira, a declaração “O valor de A é maior que 10” será exibida.

  • Se a função de guarda for avaliada como qualquer outra coisa, a instrução “O valor de A é menor que 10” é exibida.

O resultado do programa acima será o seguinte -

Resultado

The value of A is less than 10

Condições de guarda múltiplas

Várias condições de guarda também podem ser especificadas para uma função. A sintaxe geral da instrução de guarda com várias condições de guarda é fornecida abaixo -

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

Onde,

  • Function(parameter) - Esta é a declaração de função que usou a condição de guarda.

  • Parameter - Geralmente, a condição de guarda é baseada no parâmetro.

  • condition1, condition1, .. conditionN - Estas são as múltiplas condições de guarda que são aplicadas às funções.

  • A instrução quando deve ser usada quando uma condição de guarda é especificada.

Vejamos um exemplo rápido de como vários protetores podem ser usados ​​-

Exemplo

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

O seguinte ponto deve ser observado sobre o exemplo acima -

  • Você notará que para a primeira declaração da função de exibição, além da condição para N> 10, a condição para is_integertambém é especificado. Portanto, somente se o valor de N for um inteiro e maior que 10, esta função será executada.

O resultado do programa acima será o seguinte -

Resultado

Greater than 10