1.1 Первая форма
Прежде чем отлить деталь, мастер вырезает форму. Не потому что так принято - потому что без формы материал не знает, чем стать. В мастерской уже есть порядок: инструменты, проверки, застава на входе. Артефакт носит имя менеджера задач и не знает, что такое задача.
Что нужно
Задача - это не просто строка текста. У неё несколько частей: порядковый номер, заголовок и статус - выполнена она или нет. Прежде чем с задачей можно будет что-то сделать - передать её, распечатать, пометить выполненной - компилятор должен знать, как она устроена. Сейчас не знает. В коде задачи не существует.
Форма
В Rust форма для связанных данных описывается ключевым словом struct. Запишем задачу:
struct Task {
id: u64,
title: String,
status: bool,
}
Task - имя формы. Внутри - три поля: id типа u64, title типа String, status типа
bool. Что означают сами типы - разберём в следующей главе; пока примем их как есть.
Теперь добавим это в main.rs и создадим первую задачу:
struct Task {
id: u64,
title: String,
status: bool,
}
fn main() {
let task = Task {
id: 1,
title: String::from("Buy coffee"),
status: false,
};
println!("Task #{}: {}", task.id, task.title);
println!("Done: {}", task.status);
}
Структура инициализируется в фигурных скобках: имя поля, двоеточие, значение. String::from
создаёт строку из текстового литерала - почему не просто "Buy coffee", объяснит глава 1.2.
К полям обращаются через точку: task.id, task.title, task.status.
make run
Task #1: Buy coffee
Done: false
make ci проходит.
Результат
Артефакт знает, что такое задача: есть форма, есть поля, компилятор с ней работает. Методов у задачи пока нет, списка нет, операций нет. Форма есть - от неё можно строить дальше.
Полный код
tqдля этой главы -1-a-task/01-giving-shape-to-nothing/.
Lore: String::from и строковые литералы
"Buy coffee" - строковый литерал, тип &str. Это ссылка на текст, который хранится прямо
в скомпилированном файле. Её нельзя изменить - только читать.
String - другая сущность: строка, которую программа создаёт в процессе работы. Её можно изменять; &str - нет.
String::from("Buy coffee") создаёт такую строку из литерала.