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
廣告