В Rust встроен богатый набор примитивных типов (Primitives), они делятся на две большие группы: скалярные типы и составные типы.
(I) Скалярные типы (Scalar Types)
Представляют одно отдельное значение, всего 6 разновидностей:
- Знаковые целые числа:
i8,i16,i32,i64,i128,isize(размер подстраивается под указатель системы) - Беззнаковые целые числа:
u8,u16,u32,u64,u128,usize(размер подстраивается под указатель системы) - Типы с плавающей точкой:
f32,f64 - Символьный тип char: хранит скалярные значения Unicode (пример:
'a','α','∞'), каждый символ занимает 4 байта - Булевый тип bool: только два возможных значения
true,false - Единичный тип (): единственное значение — пустой кортеж
(). Несмотря на внешний вид кортежа, он содержит лишь одно значение, поэтому не относится к составным типам.
(II) Составные типы (Compound Types) (изучаются позже)
Состоят из нескольких объединенных значений:
- Массив: пример
[1, 2, 3] - Кортеж: пример
(1, true)
1) Способы указания типа переменной
Для любой переменной можно вручную задать тип. Числовые типы дополнительно поддерживают суффиксное указание типа; если тип не указан, используется стандартный вариант:
- Стандарт для целых чисел:
i32 - Стандарт для чисел с плавающей точкой:
f64
Rust также способен автоматически выводить тип по контексту кода.
2) Типы переменных
1. Явное указание типа
Тип прописывается сразу после имени переменной через : тип, подходит для всех переменных.
fn main() {
let isOpen: bool = true;
let price: f64 = 1.0;
}Code language: JavaScript (javascript)
В примере выше isOpen и price — переменные, запись : имя_типа после имени явно задает тип переменной.
2. Суффиксное указание типа для чисел
К числовому значению добавляется суффикс типа, чтобы определить его разновидность; работает только с цифрами.
fn main() {
let an_integer = 5i32;
}Code language: JavaScript (javascript)
Здесь тип не указан через двоеточие, а определен суффиксом i32 у присваиваемого числа как 32-битное целое.
3. Правила стандартных типов
Без любых пометок или суффиксов компилятор использует стандартный тип:
- Целая литеральная константа → стандарт
i32 - Литеральная константа с плавающей точкой → стандарт
f64
fn main() {
let default_float = 3.0; // автоматически f64
let default_integer = 7; // автоматически i32
}Code language: JavaScript (javascript)
4. Контекстный вывод типа
Компилятор может по последующему коду сам определить реальный тип переменной, без ручного указания.
fn main() {
let mut inferred_type = 12;
inferred_type = 4294967296i64; // по этой строке выводится тип i64
}Code language: JavaScript (javascript)
Изменяемые переменные & особенности переменных
1 Изменяемая переменная
Переменная, помеченная ключевым словом mut, ее значение можно менять.
fn main() {
let mut mutable = 12;
mutable = 21; // допустимо, изменение значения
}Code language: JavaScript (javascript)
2 Тип неизменяем
Как только тип переменной зафиксирован, его нельзя поменять за все время выполнения программы; присваивание значения другого типа сразу вызовет ошибку компиляции.
fn main() {
let mut mutable = 12;
mutable = 21; // допустимо, изменение значения
mutable = true; // ошибка: исходный тип i32, присвоить bool нельзя
}Code language: JavaScript (javascript)
C:\Users\Jack\Desktop\rustdemo>rustc hello.rs
error[E0308]: mismatched types
--> hello.rs:5:12
|
3 | let mut mutable = 12;
| -- expected due to this value
4 | mutable = 21; // допустимо, изменение значения
5 | mutable = true; // ошибка: исходный тип i32, присвоить bool нельзя
| ^^^^ expected integer, found `bool`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0308`.Code language: JavaScript (javascript)
Примечание
В Rust значения переменных по умолчанию неизменны. Если нужно изменять значение, добавьте ключевое слово mut — это отличие от других языков программирования.
Например, код ниже встречается в других языках, но в Rust выдаст ошибку
fn main() {
let mutable:i32 = 12;
mutable = 21; // допустимо, изменение значения
}Code language: JavaScript (javascript)
Ошибка компиляции
C:\Users\Jack\Desktop\rustdemo>rustc hello.rs
error[E0384]: cannot assign twice to immutable variable `mutable`
--> hello.rs:4:2
|
3 | let mutable:i32 = 12;
| ------- first assignment to `mutable`
4 | mutable = 21; // допустимо, изменение значения
| ^^^^^^^^^^^^ cannot assign twice to immutable variable
|
help: consider making this binding mutable
|
3 | let mut mutable:i32 = 12;
| +++
warning: variable `mutable` is assigned to, but never used
--> hello.rs:3:6
|
3 | let mutable:i32 = 12;
| ^^^^^^^
|
= note: consider using `_mutable` instead
= note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
warning: value assigned to `mutable` is never read
--> hello.rs:4:2
|
4 | mutable = 21; // допустимо, изменение значения
| ^^^^^^^^^^^^
|
= help: maybe it is overwritten before being read?
= note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default
error: aborting due to 1 previous error; 2 warnings emitted
For more information about this error, try `rustc --explain E0384`.Code language: JavaScript (javascript)
3 Затенение переменных (Shadowing)
Повторное объявление переменной с одинаковым именем через let затеняет старую переменную; это две независимые сущности, их типы могут отличаться.
fn main() {
let mutable = 12;
let mutable = true; // затеняет переменную типа i32 выше, новая переменная имеет тип bool
}Code language: JavaScript (javascript)
Составные типы: Массив & Кортеж
1. Массив
- Синтаксис:
[тип_элемента; длина], тип и длина фиксированы, все элементы должны иметь одинаковый тип.
let my_array: [i32; 5] = [1, 2, 3, 4, 5];Code language: JavaScript (javascript)
2. Кортеж
- Оборачивается скобками
(), может хранить несколько значений разных типов.
let my_tuple = (5u32, 1u8, true, -5.04f32);Code language: JavaScript (javascript)