查看源代码 操作符参考

本文档完整地介绍了 Elixir 中的操作符,包括它们的解析方式、定义方式以及重写方式。

操作符优先级和结合性

以下是 Elixir 可解析的所有操作符的列表,按优先级从高到低排序,以及它们的结合性

操作符结合性
@一元
.
+ - ! ^ not一元
**
* /
+ -
++ -- +++ --- .. <>
in not in
|> <<< >>> <<~ ~>> <~ ~> <~>
< > <= >=
== != =~ === !==
&& &&& and
|| ||| or
=
&一元
=> (仅在 %{} 内有效)
|
::
when
<- \\

通用操作符

Elixir 提供以下内置操作符

  • +- - 一元正/负号
  • +-*/ - 基本算术运算
  • ++-- - 列表拼接和删除
  • and&& - 严格和宽松的布尔 "and"
  • or|| - 严格和宽松的布尔 "or"
  • not! - 严格和宽松的布尔 "not"
  • innot in - 成员关系
  • @ - 模块属性
  • ......// - 范围创建
  • <> - 二进制拼接
  • |> - 管道
  • =~ - 基于文本的匹配

其中许多可以在守卫中使用;请查阅 允许的守卫函数和操作符列表

此外,还有一些其他操作符是 Elixir 解析但实际上不使用的。有关这些操作符的列表以及使用指南,请参见下面的 自定义和重写操作符

还有一些其他操作符是特殊形式,无法重写

  • ^ - 固定操作符
  • . - 点操作符
  • = - 匹配操作符
  • & - 捕获操作符
  • :: - 类型操作符

最后,这些操作符出现在上面的优先级表中,但仅在特定结构中才有意义

比较操作符

Elixir 提供以下内置比较操作符(所有这些操作符都可以在守卫中使用)

  • == - 等于
  • === - 严格等于
  • != - 不等于
  • !== - 严格不等于
  • < - 小于
  • > - 大于
  • <= - 小于或等于
  • >= - 大于或等于

===== 之间的唯一区别是,当比较整数和浮点数时,=== 是严格的

iex> 1 == 1.0
true
iex> 1 === 1.0
false

!=!== 分别充当 ===== 的否定。

自定义和重写操作符

定义自定义操作符

Elixir 能够解析一组预定义的操作符。无法定义新操作符(如某些语言支持的那样)。但是,并非 Elixir 可解析的所有操作符都由 Elixir 使用:例如,+|| 由 Elixir 用于加法和布尔,但 <~> 未被使用(但有效)。

要定义操作符,可以使用常用的 def* 结构(defdefpdefmacro 等),但语法类似于操作符的使用方式

defmodule MyOperators do
  # We define ~> to return the maximum of the given two numbers,
  # and <~ to return the minimum.

  def a ~> b, do: max(a, b)
  def a <~ b, do: min(a, b)
end

要使用新定义的操作符,您必须导入定义它们的模块

iex> import MyOperators
iex> 1 ~> 2
2
iex> 1 <~ 2
1

以下是 Elixir 可解析但默认情况下未使用的所有操作符的表格

  • |||
  • &&&
  • <<<
  • >>>
  • <<~
  • ~>>
  • <~
  • ~>
  • <~>
  • +++
  • ---

以下操作符在导入 Bitwise 模块时使用:&&&<<<>>>|||。有关更多信息,请参见 Bitwise 的文档。

请注意,Elixir 社区一般不鼓励使用自定义操作符。它们可能难以阅读,更难以理解,因为它们没有像函数那样的描述性名称。也就是说,某些特定情况或自定义领域特定语言 (DSL) 可能会证明这些做法是合理的。

也可以替换预定义的操作符,例如 +,但这样做极其不建议。