基本操作符

在上一个章节,我们看到Elixir提供了+-*/作为算数操作符,还有函数div/2rem/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也提供了三个布尔操作符:orandnot。这些操作符要求以布尔类型作为其弟一个参数:

  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: 1

orand是短路运算符。它们在左边不足够确定结果时才会执行右边:

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

注意:如果你是一名Erlang开发者,Elixir中的andor对应着Erlang中的andalsoorelse运算符。

除此之外,Elixir也提供||&&!操作符,它们接受任何形式的参数。在这些操作符中,除了falsenil之外的值都会被认定为真:

  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

你不必记住这个顺序,但需要知道它的存在。

操作符表

  1. OPERATOR ASSOCIATIVITY
  2. @ Unary
  3. . Left to right
  4. + - ! ^ not ~~~ Unary
  5. * / Left to right
  6. + - Left to right
  7. ++ -- .. <> Right to left
  8. in Left to right
  9. |> <<< >>> ~>> <<~ ~> <~ <~> <|> Left to right
  10. < > <= >= Left to right
  11. == != =~ === !== Left to right
  12. && &&& and Left to right
  13. || ||| or Left to right
  14. = Right to left
  15. => Right to left
  16. | Right to left
  17. :: Right to left
  18. when Right to left
  19. <-, \\ Left to right
  20. & Unary

这些操作符中的大部分会在我们的教程中学习到。在下一章,我们将讨论一些基本函数,数据类型转换和一点点控制流。