Erlang - 保卫(Guards)



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

保卫语句的通用语法如下:

function(parameter) when condition ->

其中:

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

  • Parameter − 保卫条件通常基于参数。

  • Condition − 应该评估的条件,以查看是否应该执行函数。

  • 当指定保卫条件时,必须使用 when 语句。

让我们快速了解一下如何使用保卫:

示例

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

关于以上示例,需要注意以下几点:

  • display 函数是与保卫一起定义的。第一个 display 声明的保卫条件是参数 N 大于 10。因此,如果参数大于 10,则将调用该函数。

  • display 函数再次定义,但这次的保卫条件是小于 10。通过这种方式,您可以多次定义相同的函数,每个函数都有一个单独的保卫条件。

上述程序的输出如下:

输出

greater than 10

保卫条件也可以用于 **if else** 和 **case** 语句。让我们看看如何在这些语句上执行保卫操作。

‘if’ 语句的保卫

保卫也可以用于 if 语句,以便执行的语句序列基于保卫条件。让我们看看如何实现这一点。

示例

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

关于以上示例,需要注意以下几点:

  • 保卫函数与 if 语句一起使用。如果保卫函数计算结果为真,则显示语句“N 大于 10”。

  • 如果保卫函数计算结果为假,则显示语句“N 小于 10”。

上述程序的输出如下:

输出

N is less than 10

‘case’ 语句的保卫

保卫也可以用于 case 语句,以便执行的语句序列基于保卫条件。让我们看看如何实现这一点。

示例

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

关于以上示例,需要注意以下几点:

  • 保卫函数与 case 语句一起使用。如果保卫函数计算结果为真,则显示语句“A 的值大于 10”。

  • 如果保卫函数计算结果为其他任何值,则显示语句“A 的值小于 10”。

上述程序的输出如下:

输出

The value of A is less than 10

多个保卫条件

也可以为一个函数指定多个保卫条件。带有多个保卫条件的保卫语句的通用语法如下:

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

关于以上示例,需要注意以下几点:

  • 您会注意到,对于第一个 display 函数声明,除了 N>10 的条件外,还指定了 **is_integer** 条件。因此,只有当 N 的值是整数且大于 10 时,才会执行此函数。

上述程序的输出如下:

输出

Greater than 10
广告