← Оглавление

1.2 Первые имена

У каждой вещи есть природа - и природа не спрашивает разрешения. Число остаётся числом, строка остаётся строкой, и попытка сложить их вместе ни к чему хорошему не приведёт, как бы убедительно это ни выглядело на бумаге. Компилятор знает об этом заранее. В этом, собственно, и состоит его работа.

Что нужно

В структуре Task три поля с тремя типами. В прошлой главе они были приняты без объяснений. Это было правильным решением тогда - и было бы плохим решением оставить так навсегда.

Материал

u64 - целое число без знака.

u означает unsigned: только ноль и числа больше нуля. 64 - разрядность: до восемнадцати с лишним квинтиллионов. Отрицательный идентификатор задачи не имеет смысла - u64 делает его невозможным. Исчерпать диапазон не получится тоже.

bool - булево значение.

true или false. У статуса задачи ровно два состояния - bool выражает их точно, без лишнего. В главе 1.4 status получит более богатое представление; пока bool достаточен.

String - строка.

Строка, которую программа создаёт в процессе работы, а не берёт готовой из исходного кода. String::from("Buy coffee") создаёт её из текстового литерала.

Вывод типов.

В определении структуры типы указываются явно: без них компилятор не знает, какую форму строить. Но в остальных местах он часто справляется сам. В main.rs это уже происходит:

let task = Task {
    id: 1,
    title: String::from("Buy coffee"),
    status: false,
};

Нигде не написано let task: Task = .... Компилятор видит правую часть и сам понимает тип. Писать его явно там, где он очевиден, - лишняя работа, которой Rust не требует.

Результат

Задача не изменилась. Но теперь ученик знает, из чего она сделана. Компилятор это знал с самого начала.

Полный код tq для этой главы - 1-a-task/02-the-names-of-things/.


Lore: целочисленные типы

В Rust несколько целочисленных типов. Принцип один: i - со знаком (signed, может быть отрицательным), u - без знака (unsigned), число - разрядность в битах.

ТипДиапазон
i32−2 147 483 648 … 2 147 483 647
u320 … 4 294 967 295
i64−9.2 × 10¹⁸ … 9.2 × 10¹⁸
u640 … 1.8 × 10¹⁹

Когда тип не указан явно и контекст не помогает, Rust по умолчанию использует i32 - он достаточно большой для большинства задач и быстр на любой современной платформе.