3-基本运算符

通过前几章的学习,我们知道Elixir提供了 +,-,*,/ 4个算术运算符,外加整数除法函数div/2和 取余函数rem/2。 Elixir还提供了++--运算符来操作列表:

  1. iex> [1,2,3] ++ [4,5,6]
  2. [1,2,3,4,5,6]
  3. iex> [1,2,3] -- [2]
  4. [1,3]

使用<>进行字符串拼接:

  1. iex> "foo" <> "bar"
  2. "foobar"

Elixir还提供了三个布尔运算符:or,and,not。这三个运算符只接受布尔值作为 第一个 参数:

  1. iex> true and true
  2. true
  3. iex> false or is_atom(:example)
  4. true

如果提供了非布尔值作为第一个参数,会报异常:

  1. iex> 1 and true
  2. ** (ArgumentError) argument error

运算符orand可短路,即它们仅在第一个参数无法决定整体结果的情况下才执行第二个参数:

  1. iex> false and error("This error will never be raised")
  2. false
  3. iex> true or error("This error will never be raised")
  4. true

如果你是Erlang程序员,Elixir中的andor其实就是andalsoorelse运算符。

除了这几个布尔运算符,Elixir还提供||&&!运算符。它们可以接受任意类型的参数值。 在使用这些运算符时,除了 false 和 nil 的值都被视作 true:

  1. # or
  2. iex> 1 || true
  3. 1
  4. iex> false || 11
  5. 11
  6. # and
  7. iex> nil && 13
  8. nil
  9. iex> true && 17
  10. 17
  11. # !
  12. iex> !true
  13. false
  14. iex> !1
  15. false
  16. iex> !nil
  17. true

根据经验,当参数确定是布尔时,使用andornot; 如果非布尔值(或不确定是不是),用&&||!

Elixir还提供了 ==,!=,===,!==,<=,>=,<,> 这些比较运算符:

  1. iex> 1 == 1
  2. true
  3. iex> 1 != 2
  4. true
  5. iex> 1 < 2
  6. true

其中=====的不同之处是后者在判断数字时更严格:

  1. iex> 1 == 1.0
  2. true
  3. iex> 1 === 1.0
  4. false

在Elixir中,可以判断不同类型数据的大小:

  1. iex> 1 < :atom
  2. true

这很实用。排序算法不必担心如何处理不同类型的数据。总体上,不同类型的排序顺序是:

  1. number < atom < reference < functions < port < pid < tuple < maps < list < bitstring

不用强记,只要知道有这么回事儿就可以。