檢視原始碼 運算子參考
這份文件是 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 用於加法和布林 or,但 <~>
未被使用(但有效)。
若要定義運算子,可以使用一般的 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) 可能證明這些做法是合理的。
也可以取代預定義的運算子,例如 +
,但極不建議這麼做。