Исходный код Справочник по операторам
В этом документе содержится полное описание операторов в 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.17.2/operators.html