← Оглавление

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") создаёт такую строку из литерала.