Source Справочник по операторам
Этот документ является полным справочником по операторам в Elixir, способам их разбора, определения и переопределения.
Порядок приоритета и ассоциативность операторов
Ниже приведен список всех операторов, которые Elixir способен распознавать, упорядоченные по убыванию приоритета и вместе с их ассоциативностью:
| Оператор | Ассоциативность |
|---|---|
@ |
Унарная |
. |
Слева направо |
+ - ! ^ not
|
Унарная |
** |
Слева направо |
* /
|
Слева направо |
+ -
|
Слева направо |
++ -- +++ --- .. <>
|
Справа налево |
in not in
|
Слева направо |
|> <<< >>> <<~ ~>> <~ ~> <~>
|
Слева направо |
< > <= >=
|
Слева направо |
== != =~ === !==
|
Слева направо |
&& &&& and
|
Слева направо |
|| ||| or
|
Слева направо |
= |
Справа налево |
& |
Унарная |
=> (действительно только внутри %{}) |
Справа налево |
| |
Справа налево |
:: |
Справа налево |
when |
Справа налево |
<- \\
|
Слева направо |
Общие операторы
Elixir предоставляет следующие встроенные операторы:
-
+и-- унарный плюс/минус -
+,-,*и/- основные арифметические операции -
++и--- конкатенация и вычитание списков -
andи&&- строгая и нестрогая логическая операция "и" -
orи||- строгая и нестрогая логическая операция "или" -
notи!- строгая и нестрогая логическая операция "не" -
inиnot in- принадлежность -
@- атрибут модуля -
..,..и..//- создание диапазонов -
<>- конкатенация бинарных данных -
|>- конвейер -
=~- сопоставление по шаблону (текстовое)
Многие из них могут быть использованы в сторожах; обратитесь к списку разрешенных функций и операторов сторожей.
Кроме того, есть несколько других операторов, которые Elixir распознаёт, но фактически не использует. Подробности об их использовании см. в разделе «Пользовательские и переопределённые операторы» ниже.
Некоторые другие операторы являются специальными формами и не могут быть переопределены:
-
^- оператор "закрепления" (pin) -
.- оператор точки -
=- оператор сопоставления -
&- оператор захвата -
::- оператор типа
Наконец, эти операторы появляются в таблице приоритетов выше, но имеют значение только в определённых конструкциях:
-
=>- см.%{} -
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.16.3/operators.html