本稿はElixir公式サイトの許諾を得て「Basic operators」の解説にもとづき、加筆補正を加えてElixirの基本的な演算子についてご説明します。
算術演算
四則演算はつぎのとおりです。演算子/
による除算は結果が整数であっても、浮動小数点数に変わることにご注意ください。
iex> 4 + 2
6
iex> 4 - 2
2
iex> 4 * 2
8
iex> 4 / 2
2.0
iex> (1 + 2) / 3 + 4 * 5
21.0
整数の割り算で、商の整数部を得るにはdiv/2
関数を用います。また、整数の剰余を求めるのはrem/2
関数です。
iex> div(10, 2)
5
iex> rem(10, 3)
1
リストの加減算
リストに別のリストの要素を加えるときは演算子++/2
、差し引くには--/2
を用います。
iex> list ++ ["Cherry"]
[3.14, :pie, true, "Apple", "Cherry"]
iex> ["π"] ++ list
["π", 3.14, :pie, true, "Apple"]
iex> list -- [true, false]
[3.14, :pie, "Apple"]
文字列の演算
文字列をつなぐ演算子は<>
です。
iex> name = "alice"
iex> "hello " <> name
"hello alice"
アトムは#{}
でかこんで文字列補間することにより、文字列に含めることができます。
iex> "hello #{:world}"
"hello world"
論理和と論理積および否定
論理和||
と論理積&&
の演算子は、左オペランド(被演算子)を論理値として評価します。Elixirではfalse
とnil
を除く値はtrue
と評価されます。それぞれの演算子が返す値はつぎのふたつの表001と002のとおりです。
表001■論理和||演算子
左オペランドの評価 | 返される値 |
---|---|
true |
左オペランドの値 |
false |
右オペランドの値 |
表002■論理和&&演算子
左オペランドの評価 | 返される値 |
---|---|
true |
右オペランドの値 |
false |
左オペランドの値 |
iex> -1 || true
-1
iex> false || 2
2
iex> nil && 3
nil
iex> true && 4
4
否定の演算子!
は、オペランドを論理値として評価したうえで、反転した論理値が返されます。
iex> !true
false
iex> !1
false
iex> !nil
true
さらに、厳密な論理演算子or
とand
およびnot
があります。いずれも、はじめのオペランドは必ず論理値でなければなりません。
iex> is_atom(:example) and 1
1
iex> false or 1
1
iex> not is_number(false)
true
iex> 1 and true
** (BadBooleanError) expected a boolean on left-side of "and", got: 1
iex> not 1
** (ArgumentError) argument error
:erlang.not(1)
論理和および論理積演算子が左オペランドを返す場合、右オペランドは実行されません。たとえば、実行されれば引数をエラーとして出力するraise/1
関数が右オペランドに置かれたつぎのコードはエラーになりません。
iex> false and raise("実行されればエラー")
false
iex> true || raise("実行されればエラー")
true
比較
値の大小や等しいか等しくないかの比較をする演算子はつぎのとおりです。
-
==
: 等しい -
!=
: 等しくない -
<=
: 以下 -
>=
: 以上 -
<
: 小さい -
>
: 大きい
iex> 1 > 2
false
iex> 1 != 2
true
iex> 1 == 1
true
iex> 1 <= 2
true
さらに、厳密な等価===
と不等価!==
の演算子があります。
iex> 1 == 1.0
true
iex> 1 === 1.0
false
Elixirでは、異なった型のデータでも大小が比べられます。データのソートを考えたとき、型を心配しなくて済むためです。
iex> :hello > 999
true
iex> {:hello, :world} > [1, 2, 3]
false
データ型による大きさの順序はつぎのとおりです(「Term ordering」参照)。
number < atom < reference < function < port < pid < tuple < map < list < bitstring
Elixir入門もくじ
- Elixir入門 01: コードを書いて試してみる
- Elixir入門 02: 型の基本
- Elixir入門 03: 演算子の基本
- Elixir入門 04: パターンマッチング
- Elixir入門 05: 条件 - case/cond/if
- Elixir入門 06: バイナリと文字列および文字リスト
- Elixir入門 07: キーワードリストとマップ
- Elixir入門 08: モジュールと関数
- Elixir入門 09: 再帰
- Elixir入門 10: EnumとStream
- Elixir入門 11: プロセス
- Elixir入門 12: 入出力とファイルシステム
- Elixir入門 13: aliasとrequireおよびimport
- Elixir入門 14: モジュールの属性
- Elixir入門 15: 構造体
- Elixir入門 16: プロトコル
- Elixir入門 17: 内包表記
- Elixir入門 18: シギル
- Elixir入門 19: tryとcatchおよびrescue
- Elixir入門 20: 型の仕様とビヘイビア
- Elixir入門 21: デバッグ
- Elixir入門 22: Erlangライブラリ
- Elixir入門 23: つぎのステップ
Top comments (0)