Перейти к основному содержанию

3. Разбираемся с макросом print!

К этому моменту на вашем компьютере уже должен быть установлен Rust и настроена среда разработки. Не доверяйте приведенным здесь текстам примеров, запускайте их у себя на компьютере. Не ленитесь, вводите каждый пример вручную. Так вы отработаете навык печати и запомните синтаксис.

Перенос строки

В самом начале мы изучили макрос print!(). Он очень удобен для обучения, позволяя выводить результаты вашей работы на экран. Также есть аналогичный макрос println!() (происходит от сочетания слов print и line). После выполнения он переводит курсор на новую строку (как Enter в вашем текстовом редакторе). Для проверки их различия запустите такую программу:

fn main() {
	print!("Первая строка");
	println!("Вторая строка");
	println!("Третья строка");
}
Результат: Первая строкаВторая строка Третья строка

Здесь третья строка перенеслась потому, что для второй использовался макрос println!().

Чтобы всё выводилось с новой строки, следует заменить print!() на println!() или распечатать знак переноса строки \n. Результат будет идентичен.

fn main() {
	print!("Первая строка");
	print!("\n");
	println!("Вторая строка");
	println!("Третья строка");
}
Результат: Первая строка Вторая строка Третья строка

Вывод чисел и выражений

Помимо текста, с помощью макроса print!(), println!() мы можем выводить какие-либо числа или значения выражений или значения переменных (их мы изучим позже). Например:

fn main() {
	print!("Сумма 3 + 5 = {}", 8);
}
В консоль выведется текст: Сумма 3 + 5 = 8

Аналогичный результат мы получим вычисляя выражение непосредственно в макросе.

fn main() {
	print!("Сумма 3 + 5 = {}", 3 + 5);
}
В консоль выведется текст: Сумма 3 + 5 = 8

В данном примере мы использовали плейсхолдер-заполнитель {} (placeholder notation) для вывода в указанном месте значения плейсхолдера (placeholder value).

Несколько заполнителей

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

fn main() {
	println!("Не приложишь {}, не появится {}.", "труд", "пруд");
}
Результат: Не приложишь труд, не появится пруд.

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

А что, если нужно несколько раз использовать одно слово? Давайте рассмотрим пример:

fn main() {
	println!("Не стыдно не {0} стыдно не {1}. Давайте {1}. ", "знать", "учиться");
}
Результат: Не стыдно не знать стыдно не учиться. Давайте учиться.

В этом случае макрос нумерует ваши значения и подставляет в заполнитель в соответствии с порядковым номером, начиная с нуля.

Преимущества позиционных аргументов:

  • Список значений можно расположить в любом порядке.
  • Значение можно ввести один раз и использовать в выводе несколько раз.

Именованные аргументы

Можно пойти ещё дальше, не нумеровать аргументы, а дать им осмысленные названия. В этом случае порядок аргументов уже не будет иметь значения.

fn main() {
	println!("Студент {name} сдал экзамен на {grade}.", grade = 5, name = "Вася");
}
Результат: Студент Вася сдал экзамен на 5.

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

Использование переменных в скобках

Можно помещать имя переменной непосредственно в фигурные скобки. Но так имеет смысл делать только для самых простых случаев, т.к. этим вы ограничиваете возможности форматирования вывода.

fn main() {
	let n = 3 + 5;
	print!("Сумма 3 + 5 = {n}");
}
Результат: Сумма 3 + 5 = 8

Эта информация для общего развития. Переменные мы рассмотрим в следующих уроках.

Макрос format!()

Макрос формат имеет все те же возможности, что и print!(), но результат этого макроса используется не для вывода текста в консоль, а для присвоения его переменной. Причем, переменная должна иметь тип String (объект строки). Типы данных мы подробнее рассмотрим в следующих уроках.

Например:

fn main(){
	let st: String;
	st = format!("Три и пять равно {}", 3+5);
	println!("{}", st);
}
Результат: Три и пять равно 8

Результатом этого кода будет связывание с переменной st строки: "Три и пять равно 8". Далее саму переменную st мы сможем использовать где захотим.

Форматирование вывода

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

Плейсхолдер для отладки программы

В будущем, в учебных примерах, вам понадобится выводить некоторые сложные типы данных, такие как векторы или массивы, которые не имеют четкого пользовательского представления. Для их вывода можно использовать плейсхолдер-заполнитель {:?}. Используйте его только для отладки программы.

println!("{:?}", vec!["a","b", "c"]);

Также есть такой  плейсхолдер-заполнитель {:#?}. Он выводит данные в нескольких строчках.

println!("{:#?}", vec![Some("Hello"), None, Some("World")]);

Попробуйте увидеть результат выполнения этого кода в своей среде разработки.

Плейсхолдер для конвертации чисел

Если есть необходимость преобразовать значение в двоичное, шестнадцатеричное или восьмеричное, используйте соответственно: {:b}, {:x}, {:o}.

Как ещё можно форматировать вывод

При выводе можно, например, округлить число. В данном примере до двух знаков после запятой:

fn main() {
	print!("{:.2}", 3.14159265);
}
Результат: 3.14

Попробуйте изменить параметры вывода и посмотреть как изменится результат.

Больше возможностей по данной теме вы найдете в документации по языку Rust: https://doc.rust-lang.org/std/fmt/. Не пугайтесь, со временем вы научитесь во всём этом разбираться.

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

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

© Клют И. А., 2022. Копирование контента возможно только с письменного разрешения автора.