Erlang-ガード
ガードは、パターンマッチングの能力を高めるために使用できる構造です。ガードを使用すると、パターン内の変数に対して簡単なテストと比較を実行できます。
ガードステートメントの一般的な構文は次のとおりです-
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).
上記の例については、次の点に注意する必要があります。
表示機能はガードとともに定義されます。最初の表示宣言には、パラメーターNが10より大きい場合のガードがあります。したがって、パラメーターが10より大きい場合、その関数が呼び出されます。
表示機能は再度定義されますが、今回はガードが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ステートメントとともに使用されます。ガード機能がtrueと評価された場合、「Nは10より大きい」というステートメントが表示されます。
ガード機能がfalseと評価された場合、「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ステートメントとともに使用されます。ガード関数がtrueと評価された場合、「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).
上記の例については、次の点に注意する必要があります。
最初の表示関数宣言では、N> 10の条件に加えて、の条件が is_integerも指定されています。したがって、Nの値が整数で10より大きい場合にのみ、この関数が実行されます。
上記のプログラムの出力は次のようになります-
出力
Greater than 10