查看源代码 操作符参考
本文档完整地介绍了 Elixir 中的操作符,包括它们的解析方式、定义方式以及重写方式。
操作符优先级和结合性
以下是 Elixir 可解析的所有操作符的列表,按优先级从高到低排序,以及它们的结合性
操作符 | 结合性 |
---|---|
@ | 一元 |
. | 左 |
+ - ! ^ not | 一元 |
** | 左 |
* / | 左 |
+ - | 左 |
++ -- +++ --- .. <> | 右 |
in not in | 左 |
|> <<< >>> <<~ ~>> <~ ~> <~> | 左 |
< > <= >= | 左 |
== != =~ === !== | 左 |
&& &&& and | 左 |
|| ||| or | 左 |
= | 右 |
& | 一元 |
=> (仅在 %{} 内有效) | 右 |
| | 右 |
:: | 右 |
when | 右 |
<- \\ | 左 |
通用操作符
Elixir 提供以下内置操作符
+
和-
- 一元正/负号+
、-
、*
和/
- 基本算术运算++
和--
- 列表拼接和删除and
和&&
- 严格和宽松的布尔 "and"or
和||
- 严格和宽松的布尔 "or"not
和!
- 严格和宽松的布尔 "not"in
和not in
- 成员关系@
- 模块属性..
、..
和..//
- 范围创建<>
- 二进制拼接|>
- 管道=~
- 基于文本的匹配
其中许多可以在守卫中使用;请查阅 允许的守卫函数和操作符列表。
此外,还有一些其他操作符是 Elixir 解析但实际上不使用的。有关这些操作符的列表以及使用指南,请参见下面的 自定义和重写操作符。
还有一些其他操作符是特殊形式,无法重写
最后,这些操作符出现在上面的优先级表中,但仅在特定结构中才有意义
比较操作符
Elixir 提供以下内置比较操作符(所有这些操作符都可以在守卫中使用)
==
和 ===
之间的唯一区别是,当比较整数和浮点数时,===
是严格的
iex> 1 == 1.0
true
iex> 1 === 1.0
false
自定义和重写操作符
定义自定义操作符
Elixir 能够解析一组预定义的操作符。无法定义新操作符(如某些语言支持的那样)。但是,并非 Elixir 可解析的所有操作符都由 Elixir 使用:例如,+
和 ||
由 Elixir 用于加法和布尔或,但 <~>
未被使用(但有效)。
要定义操作符,可以使用常用的 def*
结构(def
、defp
、defmacro
等),但语法类似于操作符的使用方式
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) 可能会证明这些做法是合理的。
也可以替换预定义的操作符,例如 +
,但这样做极其不建议。