Erlang - 守卫(guards)

守卫(guards)是我们可以用来增强模式匹配能力的结构。 使用守卫(guards),我们可以对模式中的变量执行简单的测试和比较。

守卫(guards)语句的一般语法如下 −

function(parameter) when condition ->

其中,

  • Function(parameter) − 这是在守卫(guards)条件中使用的函数声明。

  • Parameter − 一般情况下,守卫(guards)条件是基于参数的。

  • condition − 应评估该条件以确定是否应执行该函数。

  • 指定守卫(guards)条件时必须使用when语句。

让我们看一个如何使用守卫(guards)的简单示例 −

示例

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

上面的例子需要注意以下几点 −

  • 显示函数与守卫(guards)一起定义。 第一个显示声明在参数 N 大于 10 时有一个守卫(guards)。因此,如果参数大于 10,则将调用该函数。

  • 再次定义显示函数,但这次的守卫(guards)少于 10 个。这样,您可以多次定义同一个函数,每个函数都有一个单独的守卫(guards)条件。

上述程序的输出如下 −

输出

greater than 10

守卫(guards)条件也可用于 if elsecase 语句。 让我们看看如何对这些语句进行守卫(guards)操作。

"if"语句的守卫(guards)

守卫(guards)也可用于 if 语句,以便执行的一系列语句基于守卫(guards)条件。 让我们看看如何实现这一目标。

示例

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

上面的例子需要注意以下几点 −

  • guard 函数与 if 语句一起使用。 如果守卫(guards)函数的计算结果为 true,则显示语句"N 大于 10"。

  • 如果守卫(guards)函数的计算结果为 false,则显示语句"N is less than 10"。

上述程序的输出如下 −

输出

N is less than 10

"case"语句的守卫(guards)

守卫(guards)也可用于 case 语句,以便执行的一系列语句基于守卫(guards)条件。 让我们看看如何实现这一目标。

示例

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

上面的例子需要注意以下几点 −

  • guard 函数与 case 语句一起使用。 如果守卫(guards)函数的计算结果为 true,则显示语句"A 的值大于 10"。

  • 如果守卫(guards)函数的计算结果为其他值,则显示语句"A 的值小于 10"。

上述程序的输出如下 −

输出

The value of A is less than 10

多重守卫(guards)条件

还可以为一个函数指定多个守卫(guards)条件。 下面给出了具有多个守卫(guards)条件的守卫(guards)语句的一般语法 −

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

其中,

  • Function(parameter) − 这是使用保护条件的函数声明。

  • parameter − 一般情况下,保护条件是基于参数的。

  • condition1 , condition1 , .. conditionN − 这些是应用于函数的多重保护条件。

  • 指定保护条件时必须使用when语句。

让我们看一个如何使用多个守卫的简单示例 −

示例

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

上面的例子需要注意以下几点−

  • 你会注意到,对于第一个显示函数声明,除了N>10的条件之外,还指定了is_integer的条件。 因此,只有当N的值为整数并且大于10时,该函数才会被执行。

上述程序的输出如下 −

输出

Greater than 10