Erlang - Guardias

Los guardias son construcciones que podemos usar para aumentar el poder de la coincidencia de patrones. Usando guardias, podemos realizar pruebas y comparaciones simples de las variables en un patrón.

La sintaxis general de la declaración de guardia es la siguiente:

function(parameter) when condition ->

Dónde,

  • Function(parameter) - Esta es la declaración de función que se utiliza en la condición de protección.

  • Parameter - Generalmente, la condición de protección se basa en el parámetro.

  • Condition - La condición que debe evaluarse para ver si la función debe ejecutarse o no.

  • La instrucción when debe usarse cuando se especifica una condición de protección.

Veamos un ejemplo rápido de cómo se pueden usar los protectores:

Ejemplo

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

Se deben tener en cuenta las siguientes cosas sobre el ejemplo anterior:

  • La función de visualización se define junto con un resguardo. La primera declaración de visualización tiene una protección de cuando el parámetro N es mayor que 10. Por lo tanto, si el parámetro es mayor que 10, se llamará a esa función.

  • La función de visualización se define de nuevo, pero esta vez con la guarda de menos de 10. De esta manera, puede definir la misma función varias veces, cada una con una condición de guarda separada.

La salida del programa anterior será la siguiente:

Salida

greater than 10

Las condiciones de protección también se pueden utilizar para if else y casedeclaraciones. Veamos cómo podemos realizar las operaciones de guardia sobre estas declaraciones.

Protectores para declaraciones 'if'

Las protecciones también se pueden utilizar para sentencias if, de modo que la serie de sentencias ejecutadas se base en la condición de protección. Veamos cómo podemos lograrlo.

Ejemplo

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

Se deben tener en cuenta las siguientes cosas sobre el ejemplo anterior:

  • La función de guardia se usa junto con la instrucción if. Si la función de protección se evalúa como verdadera, se muestra la declaración "N es mayor que 10".

  • Si la función de protección se evalúa como falsa, se muestra la declaración "N es menor que 10".

La salida del programa anterior será la siguiente:

Salida

N is less than 10

Protectores para declaraciones de casos

Las protecciones también se pueden utilizar para declaraciones de casos, de modo que la serie de declaraciones ejecutadas se base en la condición de protección. Veamos cómo podemos lograrlo.

Ejemplo

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

Se deben tener en cuenta las siguientes cosas sobre el ejemplo anterior:

  • La función de guardia se utiliza junto con la declaración del caso. Si la función de protección se evalúa como verdadera, se muestra la declaración "El valor de A es mayor que 10".

  • Si la función de protección evalúa cualquier otra cosa, entonces se muestra la declaración "El valor de A es menor que 10".

La salida del programa anterior será la siguiente:

Salida

The value of A is less than 10

Múltiples condiciones de guardia

También se pueden especificar varias condiciones de protección para una función. La sintaxis general de la declaración de protección con múltiples condiciones de protección se da a continuación:

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

Dónde,

  • Function(parameter) - Esta es la declaración de función que usó la condición de guardia.

  • Parameter - Generalmente, la condición de protección se basa en el parámetro.

  • condition1, condition1, .. conditionN - Estas son las múltiples condiciones de protección que se aplican a las funciones.

  • La instrucción when debe usarse cuando se especifica una condición de protección.

Veamos un ejemplo rápido de cómo se pueden usar varios protectores:

Ejemplo

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

Debe tenerse en cuenta el siguiente punto sobre el ejemplo anterior:

  • Observará que para la primera declaración de función de visualización, además de la condición para N> 10, la condición para is_integertambién se especifica. Entonces, solo si el valor de N es un número entero y mayor que 10, esta función se ejecutará.

La salida del programa anterior será la siguiente:

Salida

Greater than 10