Операторы
В данном документе приводится полная справка по операторам в 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 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.15.4/operators.html