結論から言いますが、Erlangにおいてはif文はCやJavaにおけるそれよりも重要性が低いです。
なぜなら、Erlangにおける条件分岐はパターンマッチングやガードなどが主なものだからです。 if文やcase文はそれを補うものという程度の扱いしかありません。
ただし、if文やcase文を使わないと書けなかったり、 使うことによって式が見やすくなることは多々ありますので覚えておいて損はありません。
それでは、早速if文の書式を見ていきましょう。
if文の書式
if
ガード1 -> 処理1;
ガード2 -> 処理2;
true -> 処理3
end,
if文はボディの中にパターンマッチを作る役割を持っています。
最後のtrueは、どのガードにも一致しなかったときに働きます。
これがないと予期しないデータが来た時にエラーとなってしまいます。これは関数やガードで習ったのと同じですね。
ちなみに、この最後の true を「 trueガード 」と呼びます。
プログラムを通してif文の使い方を見てみましょう。
-module(even_checker).
-export([is_eveng/1,is_eveni/1]).
is_even_g(X) when X rem 2 =:= 0 ->
true;
is_even_g(_X) ->
false.
is_even_i(X) ->
if
X rem 2 =:= 0 -> true;
true -> false
end.
is_even_gが通常のやり方で、is_even_iがifを使ったやり方です。
私は特別の場合にしかif文は使いません。その特別な場合とは、
「同じパターンに対するガードが多いとき」です。
たとえば以下のような文をどう思いますか。
パターン1 when ガード1 -> .....
パターン1 when ガード2 -> .....
パターン1 when ガード3 -> .....
パターン1 when ガード4 -> .....
パターン1 -> .....
パターン2 when ガード1 -> .....
同じパターンを毎回書いて、ガードの内容だけ書き換えていますね。 これを以下のように修正すると多少見やすくなります
パターン1 ->
if
ガード1 -> ....
ガード2 -> ....
ガード3 -> ....
ガード4 -> ....
true -> ....
end;
パターン2 -> ......
ちょっと見やすくなりましたね。
それでは、最後に先ほどの実行結果を貼っておきます。
動作はどちらも同じようですね。
1> even_checker:is_even_g(5).
false
2> even_checker:is_even_g(2).
true
3> even_checker:is_even_i(5).
false
4> even_checker:is_even_i(2).
true