LoginSignup
4
0

More than 3 years have passed since last update.

[Elixir]nilとの比較演算がtrueになる件について

Last updated at Posted at 2020-08-23

Elixirの比較演算について

現象:
Elixirで数値とnilの比較を行うとtrueの結果になりました。
例えば、以下の結果になります。

iex(5)> 3 <= nil
true

true?
falseか例外があがると思っていたところ予想外の展開。

いくつか他言語の例を見てみます。1
Rubyの場合:

irb(main):001:0> nil <= 3                                                                                               Traceback (most recent call last):
        4: from C:/Ruby27-x64/bin/irb.cmd:31:in `<main>'
        3: from C:/Ruby27-x64/bin/irb.cmd:31:in `load'
        2: from C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/irb-1.2.3/exe/irb:11:in `<top (required)>'
        1: from (irb):1
NoMethodError (undefined method `<=' for nil:NilClass)

JavaScriptの場合:

null > 0
false

Elixirに戻ります。
これは、Elixirではnilに限らず、異なるデータ型間での比較が可能なためで、以下の順序が定義されていました。
number < atom < reference < function < port < pid < tuple < map < list < bitstring2

nilatomに分類される3ため、3 <= niltrueになったようです。
以下、nilatomになることの確認

iex(1)> is_number(nil)
false
iex(2)> is_atom(nil)
true
iex(3)> is_reference(nil)
false
iex(4)> is_function(nil)
false
iex(5)> is_port(nil)
false
iex(6)> is_pid(nil)
false
iex(7)> is_tuple(nil)
false
iex(8)> is_map(nil)
false
iex(9)> is_list(nil)
false
iex(10)> is_bitstring(nil)
false

上記を踏まえて、いくつか他の型との比較を検証します。

1.functionとnilの比較

iex(11)> f = fn x -> x end
#Function<6.99386804/1 in :erl_eval.expr/5>
iex(12)> f > nil
true

2.tupleとnilの比較

iex(13)> {:ok,0} > nil
true

3.listとnilの比較

iex(14)> [1,2,3] > nil
true

他の言語と一緒だと思っているとはまりそうなところなので、残して置こうと思います。

参考文献:

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0