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 < bitstring
2
nil
はatom
に分類される3ため、3 <= nil
がtrue
になったようです。
以下、nil
はatom
になることの確認
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
他の言語と一緒だと思っているとはまりそうなところなので、残して置こうと思います。
参考文献: