檢視原始碼 運算子參考

這份文件是 Elixir 中運算子的完整參考,說明它們如何解析、如何定義,以及如何覆寫。

運算子優先順序和結合性

以下是 Elixir 能夠解析的所有運算子清單,按優先順序從高到低排列,並附上它們的結合性

運算子結合性
@單元
.
+ - ! ^ not單元
**
* /
+ -
++ -- +++ --- .. <>
in not in
|> <<< >>> <<~ ~>> <~ ~> <~>
< > <= >=
== != =~ === !==
&& &&& and
|| ||| or
=
&單元
=>(僅在 %{} 內有效)
|
::
when
<- \\

一般運算子

Elixir 提供以下內建運算子

  • +- - 單元正負
  • +, -, *, 和 / - 基本算術運算
  • ++-- - 清單串接和減法
  • and&& - 嚴格和寬鬆布林「and」
  • or|| - 嚴格和寬鬆布林「or」
  • not! - 嚴格和寬鬆布林「not」
  • innot in - 成員資格
  • @ - 模組屬性
  • .., .., 和 ..// - 範圍建立
  • <> - 二進位串接
  • |> - 管線
  • =~ - 基於文字的比對

其中許多可以在防護中使用;請參閱 允許的防護函式和運算子清單

此外,還有其他一些 Elixir 會解析但實際上並未使用的運算子。請參閱下方的 自訂和覆寫運算子 以取得清單和使用準則。

其他一些運算子是特殊形式,無法覆寫

  • ^ - pin 運算子
  • . - 點運算子
  • = - 比對運算子
  • & - 擷取運算子
  • :: - 類型運算子

最後,這些運算子出現在上面的優先順序表中,但僅在特定結構中才有意義

比較運算子

Elixir 提供下列內建比較運算子(所有運算子都可以在守衛中使用)

  • == - 等於
  • === - 嚴格等於
  • != - 不等於
  • !== - 嚴格不等於
  • < - 小於
  • > - 大於
  • <= - 小於或等於
  • >= - 大於或等於

===== 之間唯一的差別是,=== 在比較整數和浮點數時是嚴格的

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

!=!== 分別作為 ===== 的否定。

自訂和覆寫運算子

定義自訂運算子

Elixir 能夠解析一組預定義的運算子。無法定義新的運算子(某些語言支援此功能)。然而,並非 Elixir 能夠解析的所有運算子都由 Elixir 使用:例如,+|| 由 Elixir 用於加法和布林 or,但 <~> 未被使用(但有效)。

若要定義運算子,可以使用一般的 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) 可能證明這些做法是合理的。

也可以取代預定義的運算子,例如 +,但極不建議這麼做。