Работа с println! и интерполяцией строк в Rust#
Макрос println!
позволяет напечатать необходимое выражение через \n
.
\n
- это аналог ввода через Enter.
Как это работает#
Когда мы используем println!
, например:
println!("sensors");
На консоль будет выведено сообщение “sensors”.
Добавление динамических значений в строку#
Ранее мы добавляли в строку захардкоженные значения. Теперь мы можем добавить динамические значения, используя фигурные скобки {}
. Это называется интерполяцией.
Пример:
let room_degree = 26;
println!("Temperature in room is {} degrees.", room_degree);
Rust интерполирует значение переменной room_degree
в строку.
Использование выражений в интерполяции#
Значения для интерполяции могут быть также динамическими выражениями, которые будут вычислены автоматически.
Пример:
let room_degree = 26;
println!("Temperature in the room is {} degrees.", room_degree - 2);
В этом случае будет выведен текст: “Temperature in the room is 24 degrees.”
Именованные аргументы#
Начиная с Rust версии 1.58.0, можно использовать именованные аргументы или как называются в других языках - шаблонные литералы, для упрощения чтения и написания кода.
Пример:
let room_degree = 26;
println!("Temperature in the room is {room_degree} degrees.");
Ошибки и особенности#
Если мы забудем указать круглые скобки, Rust не будет ничего вычислять, а просто выведет строку.
Пример:
println!("Temperature in the room is room_degree degrees.");
Выведет: “Temperature in the room is room_degree degrees.”
Также важно не допускать ошибку при указании имени переменной при интерполяции - компилятор будет ругаться.
Использование нескольких значений#
Если необходимо указать несколько значений в строке, просто прописываем их через запятую.
Пример:
let living_room_degree = 26;
let kitchen_degree = 24;
println!("Temperature in the living room is {}. And temperature in the kitchen is {}", living_room_degree, kitchen_degree);
Либо воспользуйтесь новым синтаксисом:
println!("Temperature in the living room is {living_room_degree}. And temperature in the kitchen is {kitchen_degree}");
Позиционные аргументы#
Rust был бы не растом если бы не имел ещё один способ для интерполяции строк. Такой способ есть это - позиционные аргументы
. Мы можем “вставлять” значения переменных в строку (аналогия со слотами) указывая номер аргумента в фигурных скобках ( {0}, {1} и т.д. ). Это позволяет использовать одни и те же переменные в нескольких местах.
Пример:
let living_room_degree = 26;
let kitchen_degree = 24;
println!("Temperature in the living room is {0}. And temperature in the kitchen is {1}. But living room is {0} degrees.", living_room_degree, kitchen_degree);
В этом случае будет выведен текст: “Temperature in the living room is 26. And temperature in the kitchen is 24. But living room is 26 degrees.”
Форматирование строк с помощью padding и выравнивания#
Хотелось бы еще упомянуть о дополнительной возможности для форматирования строк с помощью println!. Вы можете использовать padding и выравнивание, чтобы “украсить” вывод данных.
Синтаксис форматирования#
Общий синтаксис форматирования выглядит следующим образом:
{variable:padding alignment minimum.maximum}
Разберем составляющие этого синтаксиса:
- variable: имя переменной, которую вы хотите вывести.
- padding: символ, который будет использоваться для заполнения пробелов.
- alignment: выравнивание текста (влево <, вправо >, или по центру ^).
- minimum: минимальная длина строки.
- maximum: максимальная длина строки (предваряется точкой).
Примеры использования#
Выравнивание целого числа по правой стороне с нулями#
let num = 123;
println!("{:0>5}", num);
Выведет: 00123
Выравнивание строки по центру с padding и минимальной длиной#
let title = "Rust";
println!("{:-^10}", title);
Выведет: ----Rust----
Выравнивание строк влево и вправо с padding#
let left_text = "Left";
let right_text = "Right";
println!("{:.<15}{:.>15}", left_text, right_text);
Выведет: Left.....................Right
Использование именованных аргументов с padding и выравниванием#
let city1 = "Москва";
let city2 = "Уфа";
println!("{city1:->10} <--> {city2:-<10}", city1 = city1, city2 = city2);
Выведет: -----Москва <--> Уфа-----