Базовые типы

В 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. Массив: пример [1, 2, 3]
  2. Кортеж: пример (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)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *