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 |
u32 | 0 … 4 294 967 295 |
i64 | −9.2 × 10¹⁸ … 9.2 × 10¹⁸ |
u64 | 0 … 1.8 × 10¹⁹ |
Когда тип не указан явно и контекст не помогает, Rust по умолчанию использует i32 - он
достаточно большой для большинства задач и быстр на любой современной платформе.