Basic Operators
前回、Elixirは四則演算があることと、整数の商や余剰を得るためにdiv
やrem
があることを学びました。今回はElixirの基本的な演算子を、Rubyと少し比較しながら学んでいきましょう。
Elixirでは、++や--を配列に対しても使うことが出来ます。
iex> [1,2,3] ++ [4,5,6]
[1,2,3,4,5,6]
iex> [1,2,3] -- [2]
[1,3]
文字列の連結は<>
で可能です。(Rubyでは+
だけで文字列を連結出来ますね)
iex> "foo" <> "bar"
"foobar"
Elixirは3つのbooleanオペレーターor
とand
とnot
を提供しています。これらのオペレーターを使うためには、初項がboolean(true/false)でなければなりません。
iex> true and true
true
iex> false or is_atom(:example)
true
初項がbooleanでない場合は、例外が起きます。
iex> 1 and true
** (ArgumentError) argument error
Rubyでは例外が起きずに、数が来たらtrueと評価するので、ここはElixirがより厳密に型を扱っていることが良くわかりますね。
irb(main):001:0> 1 and true
=> true
or
とand
は短絡オペレーターです。もし左側だけで結果を決定できないときのみ、右側も実行します。(例えばfalse and
の場合は右側に何がきてもfalseなのでfalseとなります。)
iex> false and raise("This error will never be raised")
false
iex> true or raise("This error will never be raised")
true
ちなみにElixirにおけるand
とor
は、Erlangのandalso
やorlese
と同一です。
これらのbooleanオペレーターと異なり、Elixirでは||
や&&
、!
はどんな型に対しても受け付けます。この場合、false
やnil
以外はtrueとして評価されます:
# or
iex> 1 || true
1
iex> false || 11
11
# and
iex> nil && 13
nil
iex> true && 17
17
# !
iex> !true
false
iex> !1
false
iex> !nil
true
おおざっぱにまとめると、以下の通りです。
- booleanであることを期待 =>
and
,or
,not
- booleanでない引数がきて良い =>
||
,&&
,!
Elixirでは比較演算子として、==
、!=
、===
、!==
、< =
、>=
、<
、>
を提供しています。
iex> 1 == 1
true
iex> 1 != 2
true
iex> 1 < 2
true
==
と===
の違いは、整数と浮動小数を比較するときに、後者の方がより厳密です。
iex> 1 == 1.0
true
iex> 1 === 1.0
false
Rubyの場合、===
はサブクラスで再定義されない限り==
と同一なので、===
そのものにこういった厳密性の意味はありません。
Elixirでは、2つのデータの型を比較可能です。(ここもRubyとはっきり異なるところです)
iex> 1 < :atom
true
異なるデータの型を比較可能な理由は実用主義によるものです。ソートアルゴリズムで異なるデータ型同士で順序付けについて心配する必要はありません。ソート順は以下のように定義されています:
number < atom < reference < functions < port < pid < tuple < maps < list < bitstring
正確にこの順番を覚える必要はありませんが、順番が存在することだけ知っているのは重要です。
次からは基本的な関数、型変換、ちょっとしたフロー制御について議論します。