Дополнение Б: Операторы и обозначения

Это дополнение содержит глоссарий синтаксиса Rust, включая операторы и другие обозначения, которые появляются сами по себе или в контексте путей, обобщений, типажей, макросов, атрибутов, комментариев, кортежей и скобок.

Операторы

Таблица Б-1 содержит операторы языка Rust, пример появления оператора, короткое объяснение, возможность перегрузки оператора. Если оператор можно перегрузить, то показан типаж, с помощью которого его можно перегрузить.

Таблица Б-1: Операторы

ОператорПримерОбъяснениеПерегружаемость
!ident!(...), ident!{...}, ident![...]Вызов макроса
!!exprПобитовое или логическое отрицаниеНе
!=var != exprСравнение "не равно"PartialEq
%expr % exprОстаток от деленияRem
%=var %= exprОстаток от деления и присваиваниеRemAssign
&&expr, &mut exprЗаимствование
&&type, &mut type, &'a type, &'a mut typeУказывает что данный тип заимствуется
&expr & exprПобитовое ИBitAnd
&=var &= exprПобитовое И и присваиваниеBitAndAssign
&&expr && exprЛогическое И
*expr * exprАрифметическое умножениеMul
*=var *= exprАрифметическое умножение и присваиваниеMulAssign
**exprРазыменование ссылки
**const type, *mut typeУказывает, что данный тип является сырым указателем
+trait + trait, 'a + traitСоединение ограничений типа
+expr + exprАрифметическое сложениеAdd
+=var += exprАрифметическое сложение и присваиваниеAddAssign
,expr, exprАргумент и разделитель элементов
-- exprАрифметическое отрицаниеNeg
-expr - exprАрифметическое вычитаниеSub
-var -= exprАрифметическое вычитание и присваиваниеSubAssign
->fn(...) -> type, ...
.expr.identДоступ к элементу
...., expr.., ..expr, expr..exprУказывает на диапазон чисел, исключая правый
..=..=expr, expr..=exprУказывает на диапазон чисел, включая правый
....exprСинтаксис обновления структуры
..variant(x, ..), struct_type { x, .. }Привязка «И все остальное»
...expr...exprВ шаблоне: шаблон диапазона включая правый элемент
/expr / exprАрифметическое делениеDiv
/=var /= exprАрифметическое деление и присваиваниеDivAssign
:pat: type, ident: typeОграничения типов
:ident: exprИнициализация поля структуры
:'a: loop {...}Метка цикла
;expr;Оператор, указывающий на конец высказывания
;[...; len]Часть синтаксиса массива фиксированного размера
<<expr << exprБитовый сдвиг влевоShl
<<=var <<= exprБитовый сдвиг влево и присваиваниеShlAssign
<expr < exprСравнение "меньше чем"PartialOrd
<=expr <= exprСравнение "меньше или равно"PartialOrd
=var = expr, ident = typeПрисваивание/эквивалентность
==expr == exprСравнение "равно"PartialEq
=>pat => exprЧасть синтаксиса конструкции match
>expr > exprСравнение "больше чем"PartialOrd
>=expr >= exprСравнение "больше или равно"PartialOrd
>>expr >> exprБитовый сдвиг вправоShr
>>=var >>= exprБитовый сдвиг вправо и присваиваниеShrAssign
@ident @ patPattern binding
^expr ^ exprПобитовое исключающее ИЛИBitXor
^=var ^= exprПобитовое исключающее ИЛИ и присваиваниеBitXorAssign
patpat
exprexpr
=var= expr
expr
?expr?Возврат ошибки

Обозначения не-операторы

Следующий список содержит все не-литералы, которые не являются операторами. То есть они не ведут себя как вызов функции или метода.

Таблица Б-2 показывает символы, которые появляются сами по себе и допустимы в различных местах.

Таблица Б-2: Автономный синтаксис

ОбозначениеОбъяснение
'identИменованное время жизни или метка цикла
...u8, ...i32, ...f64, ...usize, etc.Числовой литерал определённого типа
"..."Строковый литерал
r"...", r#"..."#, r##"..."##, etc.Необработанный строковый литерал, в котором не обрабатываются escape-символы
b"..."Строковый байтовый литерал; создаёт [u8] вместо строки
br"...", br#"..."#, br##"..."##, etc.Необработанный строковый байтовый литерал, комбинация необработанного и байтового литерала
'...'Символьный литерал
b'...'ASCII байтовый литерал
...
!Всегда пустой тип для расходящихся функций
_«Игнорируемое» связывание шаблонов; также используется для читабельности целочисленных литералов

Таблица Б-3 показывает обозначения которые появляются в контексте путей иерархии модулей

Таблица Б-3. Синтаксис, связанный с путями

ОбозначениеОбъяснение
ident::identПуть к пространству имён
::pathПуть относительно корня крейта (т. е. явный абсолютный путь)
self::pathПуть относительно текущего модуля (т. е. явный относительный путь).
super::pathПуть относительно родительского модуля текущего модуля
type::ident, <type as trait>::identАссоциированные константы, функции и типы
<type>::...Ассоциированный элемент для типа, который не может быть назван прямо (например <&T>::..., <[T]>::..., etc.)
trait::method(...)Устранение неоднозначности вызова метода путём именования типажа, который определяет его
type::method(...)Устранение неоднозначности путём вызова метода через имя типа, для которого он определён
<type as trait>::method(...)Устранение неоднозначности вызова метода путём именования типажа и типа

Таблица Б-4 показывает обозначения которые появляются в контексте использования обобщённых типов параметров

Таблица Б-4: Обобщения

ОбозначениеОбъяснение
path<...>Определяет параметры для обобщённых параметров в типе (e.g., Vec<u8>)
path::<...>, method::<...>Определяет параметры для обобщённых параметров, функций, или методов в выражении. Часто называют turbofish (например "42".parse::<i32>())
fn ident<...> ...Определение обобщённой функции
struct ident<...> ...Определение обобщённой структуры
enum ident<...> ...Объявление обобщённого перечисления
impl<...> ...Определение обобщённой реализации
for<...> typeВысокоуровневое связывание времени жизни
type<ident=type>Обобщённый тип где один или более ассоциированных типов имеют определённое присваивание (например Iterator<Item=T>)

Таблица Б-5 показывает обозначения которые появляются в контексте использования обобщённых типов параметров с ограничениями типов

Таблица Б-5: Ограничения типов

ОбозначениеОбъяснение
T: UОбобщённый параметр T ограничивается до типов которые реализуют типаж U
T: 'aОбобщённый тип T должен существовать не меньше чем 'a (то есть тип не может иметь ссылки с временем жизни меньше чем 'a)
T : 'staticОбобщённый тип T не имеет заимствованных ссылок кроме имеющих время жизни 'static
'b: 'aОбобщённое время жизни 'b должно быть не меньше чем 'a
T: ?SizedПозволяет обобщённым типам параметра иметь динамический размер
'a + trait, trait + traitСоединение ограничений типов

Таблица Б-6 показывает обозначения, которые появляются в контексте вызова или определения макросов и указания атрибутов элемента.

Таблица Б-6: Макросы и атрибуты

ОбозначениеОбъяснение
#[meta]Внешний атрибут
#![meta]Внутренний атрибут
$identПодстановка в макросе
$ident:kindЗахват макроса
$(…)…Повторение макроса
ident!(...), ident!{...}, ident![...]Вызов макроса

Таблица Б-7 показывает обозначения, которые создают комментарии.

Таблица Б-7: Комментарии

ОбозначениеОбъяснение
//Однострочный комментарий
//!Внутренний однострочный комментарий документации
///Внешний однострочный комментарий документации
/*...*/Многострочный комментарий
/*!...*/Внутренний многострочный комментарий документации
/**...*/Внешний многострочный комментарий документации

Таблица Б-8 показывает обозначения, которые появляются в контексте использования кортежей.

Таблица Б-8: Кортежи

ОбозначениеОбъяснение
()Пустой кортеж, он же пустой тип. И литерал и тип.
(expr)Выражение в скобках
(expr,)Кортеж с одним элементом выражения
(type,)Кортеж с одним элементом типа
(expr, ...)Выражение кортежа
(type, ...)Тип кортежа
(type, ...)Выражение вызова функции; также используется для инициализации структур-кортежей и вариантов-кортежей перечисления
expr.0, expr.1, etc.Взятие элемента по индексу в кортеже

Таблица Б-9 показывает контексты, в которых используются фигурные скобки.

Таблица Б-9: Фигурные скобки

КонтекстОбъяснение
{...}Выражение блока
Type {...}struct литерал

Таблица Б-10 показывает контексты, в которых используются квадратные скобки.

Таблица Б-10: Квадратные скобки

КонтекстОбъяснение
[...]Литерал массива
[expr; len]Литерал массива, содержащий len копий expr
[type; len]Массив, содержащий len экземпляров типа type
expr[expr]Взятие по индексу в коллекции. Возможна перегрузка (Index, IndexMut)
expr[..], expr[a..], expr[..b], expr[a..b]Взятие среза коллекции по индексу, используется Range, RangeFrom, RangeTo, или RangeFull как "индекс"