# Работа с println! и интерполяцией строк в Rust

> Узнайте о макросе println! и интерполяции строк в Rust. В этой статье мы рассмотрим, как использовать println! для вывода сообщений, добавлять динамические значения в строку и использовать именованные аргументы. Rust, println!, интерполяция строк, динамические значения, именованные аргументы

- **URL:** https://eagle2000.space/rust/rust-str-interpolation/
- **Date:** 2025-05-03

- **Tags:** rust, dev

---# Работа с println! и интерполяцией строк в Rust

Макрос `println!` позволяет напечатать необходимое выражение через `\n`. 

`\n` - это аналог ввода через Enter.

## Как это работает

Когда мы используем `println!`, например:
```rust
println!("sensors");
```
На консоль будет выведено сообщение "sensors".

## Добавление динамических значений в строку

Ранее мы добавляли в строку захардкоженные значения. Теперь мы можем добавить динамические значения, используя фигурные скобки `{}`. Это называется интерполяцией.

Пример:
```rust
let room_degree = 26;
println!("Temperature in room is {} degrees.", room_degree);
```
Rust интерполирует значение переменной `room_degree` в строку.

## Использование выражений в интерполяции

Значения для интерполяции могут быть также динамическими выражениями, которые будут вычислены автоматически.

Пример:
```rust
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, можно использовать [именованные аргументы](https://blog.rust-lang.org/2022/01/13/Rust-1.58.0/) или как называются в других языках - шаблонные литералы, для упрощения чтения и написания кода.

Пример:
```rust
let room_degree = 26;
println!("Temperature in the room is {room_degree} degrees.");
```
## Ошибки и особенности

Если мы забудем указать круглые скобки, Rust не будет ничего вычислять, а просто выведет строку.

Пример:
```rust
println!("Temperature in the room is room_degree degrees.");
```
Выведет: "Temperature in the room is room_degree degrees."

Также важно не допускать ошибку при указании имени переменной при интерполяции - компилятор будет ругаться.

## Использование нескольких значений

Если необходимо указать несколько значений в строке, просто прописываем их через запятую.

Пример:
```rust
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);
```

Либо воспользуйтесь новым синтаксисом:
```rust
println!("Temperature in the living room is {living_room_degree}. And temperature in the kitchen is {kitchen_degree}");
```

## Позиционные аргументы

Rust был бы не растом если бы не имел ещё один способ для интерполяции строк. Такой способ есть это - `позиционные аргументы`. Мы можем "вставлять" значения переменных в строку (аналогия со слотами) указывая номер аргумента в фигурных скобках ( {0}, {1} и т.д. ). Это позволяет использовать одни и те же переменные в нескольких местах.

Пример:
```rust
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 и выравнивания
{{< keyword >}} 🦀 **rust skill** {{< /keyword >}}

Хотелось бы еще упомянуть о дополнительной возможности для форматирования строк с помощью println!. Вы можете использовать padding и выравнивание, чтобы "украсить" вывод данных.

### Синтаксис форматирования

Общий синтаксис форматирования выглядит следующим образом:

```
{variable:padding alignment minimum.maximum}
```

Разберем составляющие этого синтаксиса:

* variable: имя переменной, которую вы хотите вывести.
* padding: символ, который будет использоваться для заполнения пробелов.
* alignment: выравнивание текста (влево <, вправо >, или по центру ^).
* minimum: минимальная длина строки.
* maximum: максимальная длина строки (предваряется точкой).

### Примеры использования

#### Выравнивание целого числа по правой стороне с нулями

```rust
let num = 123;
println!("{:0>5}", num);
```

Выведет: `00123`

#### Выравнивание строки по центру с padding и минимальной длиной

```rust
let title = "Rust";
println!("{:-^10}", title);
```

Выведет: `----Rust----`

#### Выравнивание строк влево и вправо с padding

```rust
let left_text = "Left";
let right_text = "Right";
println!("{:.<15}{:.>15}", left_text, right_text);
```

Выведет: `Left.....................Right`

#### Использование именованных аргументов с padding и выравниванием

```rust
let city1 = "Москва";
let city2 = "Уфа";
println!("{city1:->10} <--> {city2:-<10}", city1 = city1, city2 = city2);
```

Выведет: `-----Москва <--> Уфа-----`

