Akatsuki Hackers Lab | 株式会社アカツキ(Akatsuki Inc.)

Akatsuki Hackers Labは株式会社アカツキが運営しています。

急いで学ぶElixir#3: 演算子編

Basic Operators

前回、Elixirは四則演算があることと、整数の商や余剰を得るためにdivremがあることを学びました。今回は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オペレーターorandnotを提供しています。これらのオペレーターを使うためには、初項が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

orandは短絡オペレーターです。もし左側だけで結果を決定できないときのみ、右側も実行します。(例えば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におけるandorは、Erlangandalsoorleseと同一です。

これらのbooleanオペレーターと異なり、Elixirでは||&&!はどんな型に対しても受け付けます。この場合、falsenil以外は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

正確にこの順番を覚える必要はありませんが、順番が存在することだけ知っているのは重要です。

次からは基本的な関数、型変換、ちょっとしたフロー制御について議論します。

元記事

http://elixir-lang.org/getting-started/basic-operators.html