Erlang - 守卫


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

Guard 语句的一般语法如下 -

function(parameter) when condition ->

在哪里,

  • 函数(参数) - 这是在保护条件中使用的函数声明。

  • 参数- 一般来说,保护条件基于参数。

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

关于上面的例子需要注意以下几点 -

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

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

上述程序的输出如下 -

输出

greater than 10

保护条件也可用于if elsecase语句。让我们看看如何对这些语句进行保护操作。

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

关于上面的例子需要注意以下几点 -

  • Guard 函数与 if 语句一起使用。如果保护函数的计算结果为 true,则显示语句“N is Greater than 10”。

  • 如果防护函数的计算结果为 false,则显示语句“N 小于 10”。

上述程序的输出如下 -

输出

N is less than 10

“案例”陈述的守卫

守卫也可用于 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.

关于上面的例子需要注意以下几点 -

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

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

上述程序的输出如下 -

输出

The value of A is less than 10

多重保护条件

还可以为一个函数指定多个保护条件。具有多个保护条件的保护语句的一般语法如下 -

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

在哪里,

  • 函数(参数) - 这是使用保护条件的函数声明。

  • 参数- 一般来说,保护条件基于参数。

  • 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