Первая программа и println!

Разбираем первую программу на Rust: функция main, макрос println! и форматирование вывода.

main — функция, с которой начинается выполнение любой программы на Rust. Без неё бинарник просто не из чего запускать.

Минимальная программа

Вот классический «Hello, world», который cargo new создаёт автоматически.

fn main() {
    println!("Hello, world!");
}

Вывод:

Hello, world!

Разберём по частям. fn объявляет функцию. main — её имя; именно с неё начинается выполнение. Круглые скобки — список параметров (здесь пустой), фигурные — тело. Каждая инструкция заканчивается точкой с запятой.

Почему println! с восклицательным знаком

Восклицательный знак означает, что println! — это не функция, а макрос. Макрос разворачивается в код на этапе компиляции. Печать в Rust сделана макросом, потому что обычная функция не может принимать переменное число аргументов и проверять строку формата на этапе компиляции, а макрос — может. Пока достаточно запомнить: видите ! — перед вами макрос.

Подстановка значений

Внутри строки формата фигурные скобки {} — это места для подстановки аргументов по порядку.

fn main() {
    let name = "Rust";
    let year = 2015;
    println!("Язык {} стабилизирован в {} году", name, year);
}

Вывод:

Язык Rust стабилизирован в 2015 году

Начиная с современных версий Rust имя переменной можно вставлять прямо в скобки — это часто читается удобнее:

fn main() {
    let name = "Rust";
    println!("Привет, {name}!");
}

Вывод:

Привет, Rust!

print! против println!

Есть два родственных макроса: print! печатает без перевода строки, println! — с переводом строки в конце. Для отладки удобен ещё {:?} — он печатает значение в «отладочном» виде, о нём подробнее в разделе про трейты.

fn main() {
    print!("один ");
    print!("два ");
    println!("три");
    println!("{:?}", (1, "два", 3.0));
}

Вывод:

один два три
(1, "два", 3.0)

Возврат значения из main

Обычно main ничего не возвращает. Но она может вернуть Result, чтобы корректно завершиться с кодом ошибки — к этому мы вернёмся в разделе про обработку ошибок.

Итог

  • fn main() — точка входа; выполнение программы начинается здесь.
  • println! — макрос (отсюда !), печатает строку с переводом строки.
  • {} подставляет аргументы по порядку; можно писать имя переменной прямо в скобках: {name}.
Проверьте себя
1. Почему у println! есть восклицательный знак?
AЭто опечатка
Bprintln! — макрос, а не обычная функция
CТак обозначают важные функции
DЭто оператор отрицания
2. Что делают фигурные скобки {} в строке формата println!?
AСоздают блок кода
BОбозначают место подстановки следующего аргумента
CЭто синтаксическая ошибка
DОбъявляют переменную
3. Чем print! отличается от println!?
AНичем
Bprint! печатает без перевода строки в конце, println! — с переводом
Cprint! быстрее
Dprint! не существует
Поддержать проект