Rust на примерах

1.2 Форматированный вывод

Вывод обрабатывается несколькими макросами, которые определены в std::fmt. Вот некоторые из них:

  • format!: записывает форматированный текст в String.
  • print!: работает аналогично с format!, но текст выводится в консоль.
  • println!: аналогично print!, но в конце добавляется переход на новую строку.

Весь текст обрабатывается аналогичным образом. Плюс данного метода в том, что корректность форматирования будет проверена на этапе комплиции программы.

fn main() {
    // `{}` автоматически будет заменено на
    // аргументы. Они будут преобразованы в строку.
    println!("{} days", 31);

    // Без суффиксов, 31 является i32. Можно изменить тип 31,
    // используя суффикс.

    // Существует множество способов работы с форматированным выводом. Можно указать
    // позицию для каждого аргумента.
    println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob");

    // Так же можно именовать аргументы.
    println!("{subject} {verb} {object}",
             object="the lazy dog",
             subject="the quick brown fox",
             verb="jumps over");

    // Специальное форматирование может быть определено после `:`.
    println!("{} of {:b} people know binary, the other half don't", 1, 2);

    // Можно выравнивать текст, сдвигая его на указанную ширину. 
    // Данный макрос отобразит в консоли
    // "     1". 5 пробелов и "1".
    println!("{number:>width$}", number=1, width=6);

    // Можно добавить к цифрам пару нулей. Данный макрос выведет "000001".
    println!("{number:>0width$}", number=1, width=6);

    // Компилятор обязательно проверит, что в макрос передано правильное количество
    // аргументов.
    println!("My name is {0}, {1} {0}", "Bond");
    // ИСПРАВЬТЕ ^ Добавьте недостающий аргумент: "James"

    // Создаем структуру, которая хранит в себе `i32`. Назовем ее `Structure`.
    #[allow(dead_code)]
    struct Structure(i32);

    // Однако, пользовательские типы данных, например, как эта структура
    // требуют более сложной обработки для вывода. Данный код не будет работать.
    println!("This struct `{}` won't print...", Structure(3));
    // ИСПРАВЬТЕ ^ Закоментируйте эту строку.
}

std::fmt содержит в себе много типажей (traits), которые управляют отображением текста. Базовая форма двух самых важных рассмотрена ниже:

  • fmt::Debug: Использует {:?} marker. Форматирует текст для отладочных целей.
  • fmt::Display: Использует {} marker. Форматирует текст в более элегантном, удобном для пользователя стиле.

В данном примере используется fmt::Display, потому что стандартная библиотека предоставляет реализацию для данного типа. Для отображения собственных типов потребуется больше дополнительных шагов.

Задание

  • Исправьте две ошибки в коде выше (смотрите ИСПРАВЬТЕ), чтобы код комплировался без ошибок
  • Добавьте макрос println!, который выводит: Pi is roughly 3.142 c помощью управления количеством знаков после запятой. Для выполнения данного задания создайте переменную, которая будет хранить в себе значение числа Пи: let pi = 3.141592. (Подсказка: вам необходимо ознакомиться с документация по std::fmt, чтобы узнать, как отобразить только часть знаков после запятой в консоли.)

Смотрите также

std::fmt, macros, struct и traits