前節で取り扱ったガードについてこの節でもう少し理解を深めます。
ガードとは一言で言ってしまえば、
whenキーワードの後ろにある条件がtrueになるかどうかを確認している
と言えます。
trueだと処理を実行して、それ以外だと実行しません。
この章では、どのようなものがガードとして使えるかということを見て行きます。
ガードに書ける式は、おおまかに2つに分けられます。
また、これらの中において決められた種類の関数を取り扱うことも可能です。
順に見て行きましょう。
比較演算子の前に、その基礎となるブール表現を扱います。
演算子 | 意味 |
---|---|
not | 論理値を反転させる |
and | 論理積 |
or | 論理和 |
xor | 排他的論理和(左辺と右辺が違えばtrue) |
orelse | 論理和(左項がtrueなら右項を調べないでtrueを返す) |
andalso | 論理積(左項がfalseなら右項を調べないでfalseを返す) |
1> not true.
false
2> true and false.
false
3> true xor false.
true
比較演算子は、左辺と右辺の関係が演算子に対して成り立っているかを調べる時に使います。
演算子 | 意味 | 型変換 |
---|---|---|
X > Y | XはYより大きい | あり |
X < Y | XはYより小さい | あり |
X >= Y | XはY以上 | あり |
X <= Y | XはY以下 | あり |
X == Y | XはYと等しい | あり |
X /= Y | XはYと等しくない | あり |
X =:= Y | XはYと等しい | なし |
X =/= Y | XはYと等しくない | なし |
1> 5 > 3.
true
2> 3 == 5.
false
3> 3 == 3.0.
true
4> 3 =:= 3.0.
false
5>
Erlangにおいては、整数と浮動小数点数の比較以外は「==ではなく=:=を使う」ことを勧められています。 同様に「/=ではなく=/=を使う」べきです。
ガード述語は返り値がboolean型の関数です。
したがって、ガードの中で利用できます。
ガード述語 | 意味 |
---|---|
is_atom/1 | アトムかどうか |
is_binary/1 | バイナリかどうか |
is_bitstring/1 | ビット文字列かどうか |
is_float/1 | 浮動小数点数かどうか |
is_function/1 | 関数かどうか |
is_function(Function, Arity) | Functionが、引数がArity個の関数かどうか |
is_integer/1 | 整数かどうか |
is_list/1 | リストかどうか |
is_number/1 | 数字かどうか |
is_pid/1/td> | プロセスIDかどうか |
is_port/1 | ポートIDかどうか |
is_record(Record, Item) | ItemがレコードRecordのものかどうか |
is_reference/1 | リファレンスかどうか |
is_tuple/1 | タプルかどうか |
それ自身は式として使えないですが、式として使える関数もあります。
ガードの中で使える関数 |
---|
abs(Number) |
byte_size(Bitstring) |
element(N, Tuple) |
float(Term) |
hd(List) |
length(List) |
node() |
node(Pid|Ref|Port) |
round(Number) |
self() |
size(Tuple|Bitstring) |
tl(List) |
trunc(Number) |
tuple_size(Tuple) |