Rust - Basic - 02 - Типы данных

Типы данных

Кратко

Разрядность числовых типов isize и usize зависит от 32/64-битной архитектуры системы, на которой выполняется программа

В режиме debug переполнение целого числа вызывает panic, в режиме release — нет

wrapping_* позволяют избежать panic даже в режиме debug

checked_* при переполнении возвращают None

overflowing_* возвращают boolean, показывающий, было ли переполнение

saturating_* при переполнении ограничивают значение минимумом/максимумом

tuple (кортеж)

let tup: (i32, f64, u8) = (500, 6.4, 1);

let tup = (500, 6.4, 1);
let (x, y, z) = tup;  // деструктуризация

let x: (i32, f64, u8) = (500, 6.4, 1);
let five_hundred = x.0;
let six_point_four = x.1;
let one = x.2;

array (массив)

let a = [1, 2, 3, 4, 5];
let a: [i32; 5] = [1, 2, 3, 4, 5];
let a = [0; 5];  // быстрая инициализация
let a = [[0, 5]; 20];  // двумерный массив

Источник

https://doc.rust-lang.org/book/ch03-02-data-types.html

Скалярные типы

…

Целочисленные типы

Кроме того, типы isize и usize зависят от того, на каком компьютере выполняется программа: 64 бита на 64-битной архитектуре и 32 бита на 32-битной.

…

Переполнение целого числа

Допустим, у вас есть переменная типа u8, которая может хранить значения от 0 до 255. Если вы попытаетесь присвоить переменной значение вне этого диапазона, например 256, произойдёт переполнение целого числа. У Rust есть интересные правила на этот счёт. При компиляции в режиме debug Rust включает проверки переполнения, которые вызывают panic программы во время выполнения, если это произойдёт. Rust использует термин «panic», когда программа завершается с ошибкой; подробнее о panic мы поговорим в разделе «Неустранимые ошибки с panic!» главы 9.

При компиляции в режиме release с флагом --release Rust не включает проверки переполнения, вызывающие panic. Вместо этого при переполнении Rust выполняет дополнительное переполнение (two’s complement wrapping). Короче говоря, значения больше максимального, которое может хранить тип, «заворачиваются» к минимуму. Для u8 значение 256 становится 0, значение 257 становится 1 и так далее. Программа не упадёт, но переменная получит значение, которое, вероятно, не то, что вы ожидали. Полагаться на такое поведение переполнения считается ошибкой.

Чтобы явно обрабатывать возможность переполнения, можно использовать семейства методов, которые стандартная библиотека предоставляет для примитивных числовых типов:

  • Заворачивать во всех режимах с помощью методов wrapping_*, например wrapping_add
  • Возвращать None при переполнении с помощью методов checked_*
  • Возвращать значение и boolean, указывающий, было ли переполнение, с помощью методов overflowing_*
  • Ограничивать значение минимумом или максимумом с помощью методов saturating_*