Источник Справочник по операторам
В этом документе представлен полный справочник по операторам Elixir, способам их обработки, определения и переопределения.
Порядок приоритета и ассоциативность операторов
Ниже приведен список всех операторов, которые может обрабатывать Elixir, упорядоченных по убыванию приоритета вместе с их ассоциативностью:
| Оператор | Ассоциативность |
|---|---|
@ |
Унарная |
. |
Левая |
+ - ! ^ not
|
Унарная |
** |
Левая |
* /
|
Левая |
+ -
|
Левая |
++ -- +++ --- .. <>
|
Правая |
in not in
|
Левая |
|> <<< >>> <<~ ~>> <~ ~> <~>
|
Левая |
< > <= >=
|
Левая |
== != =~ === !==
|
Левая |
&& &&& and
|
Левая |
|| ||| or
|
Левая |
= |
Правая |
&, ...
|
Унарная |
=> (действительно только внутри %{}) |
Правая |
| |
Правая |
:: |
Правая |
when |
Правая |
<- \\
|
Левая |
Общие операторы
Elixir предоставляет следующие встроенные операторы:
-
+и-- унарный положительный/отрицательный -
+,-,*и/- основные арифметические операции -
++и--- конкатенация и вычитание списков -
andи&&- строгий и нестрогий логический «и» -
orи||- строгий и нестрогий логический «или» -
notи!- строгий и нестрогий логический «не» -
inиnot in- принадлежность -
@- атрибут модуля -
..,..и..//- создание диапазона -
<>- конкатенация бинарных данных -
|>- конвейер -
=~- сопоставление по тексту
Многие из них могут быть использованы в защитах; обратитесь к списку разрешенных функций и операторов.
Кроме того, есть несколько других операторов, которые Elixir обрабатывает, но фактически не использует. См. Пользовательские и переопределённые операторы ниже для списка и рекомендаций по их использованию.
Некоторые другие операторы являются специальными формами и не могут быть переопределены:
-
^- оператор «привязки» -
.- оператор точки -
=- оператор сопоставления -
&- оператор захвата -
::- оператор типа
Наконец, эти операторы появляются в таблице приоритетов выше, но имеют смысл только в определённых конструкциях:
-
=>- см.%{} -
when- см. Защиты -
<-- см.forиwith -
\\- см. Аргументы по умолчанию
Операторы сравнения
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) такие приёмы могут быть оправданы.
Также возможно заменить предопределённые операторы, такие как +, но от этого крайне не рекомендуется.
© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.18.1/operators.html