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
正確にこの順番を覚える必要はありませんが、順番が存在することだけ知っているのは重要です。
次からは基本的な関数、型変換、ちょっとしたフロー制御について議論します。