Элементы тела функций

Тело функции состоит из последовательного набора элементов. Ниже перечислены основные из них.

Объявление переменных

См. Переменные.

Объявление auto переменной

См. auto переменные.

Простое выражение

Обычно оно необходимо, чтобы позвать какую-либо функцию, имеющую сторонние эффекты. Разрешено объявлять простые выражения без побочных эффектов, но это не имеет особого смысла.

Foo(); // Вызов какой-то функции, возможно, имеющей сторонние эффекты
Add( 5, 7 ); // Вызов функции, не имеющей эффектов
1 + 2; // Так тоже можно, но не особо то и нужно

Присваивание

Состоит из левой части, которой присваивается значение и правой, из которой берётся значение.

x = 2; // Присваиваем переменной числовое значение
x = Foo() + Bar() - 66; // Присваиваем переменной значение сложного выражения
Min( x, y )= 0; // Так тоже можно, если результатом функции "Min" будет изменяемая ссылка

Выполнение операции с присваиванием

Существуют следующие операции с присваиванием:

  • += - добавление
  • -= - вычитание
  • *= - домножение
  • /= - деление
  • %= - взятие остатка от деления
  • &= - побитовое AND
  • |= - побитовое OR
  • ^= - побитовое XOR
  • =<< - сдвиг вправо
  • =>> - сдвиг в лево

Операция с присваиванием аналогична вызову соответствующего бинарного оператора для левого и правого выражений с последующим присваиванием получившегося значения левому выражению.

x += 2; // Увеличиваем значение переменной "x" на 2
x /= Foo() + Bar() - 66; // Делим переменную "x" на результат выражения справа, после чего сохраняем результат в неё же
Min( x, y ) &= 0xFF; // Зануляем старшые биты для переменной - результата выполнения функции "Min"

Инкремент и Декремент

++ увеличивает значение выражения целочисленного типа на единицу, -- уменьшает.

++ x;
-- x;
++ Min( x, y );

Элементы контроля потока управления

См. Поток управления.

static_assert

См. static_assert.

halt

См. Halt.

Блок

Блок состоит их набора элементов в {} скобках. Блок может включать в себя все вышеперечисленные элементы а также другие блоки.

Блок необходим прежде всего для ограничения области видимости переменных. Переменная, объявленная в блоке, будет видна только в нём и во внутренних блоках. Переменные, объявленные в блоке, имеют время жизни, ограниченное им. При выходе потока управления из блока перестают существовать все переменные, объявленные в нём.

В блоке можно объявить переменную с тем же именем, что и во внешнем блоке, после чего переменная из внешнего блока будет недоступна.

fn Foo()
{
    var i32 mut x= 0;
    {
         ++x; // Изменили значение внешней переменной
         var f64 mut x= 3.14; // Объявили переменную с тем же именем, что во внешнем блоке. Теперь переменная "x" из внешнего блока будет недоступна до конца этого блока.
         x= 0.0; // Изменили значение переменной текущего блока
         var i32 mut y= 0;
    }
    --y; // Ошибка - имя "y" не найдено
}