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 else 和 case 语句。 让我们看看如何对这些语句进行守卫(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