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