Ввод и вывод данных в Rust 1.75: подробное руководство
Ввод и вывод данных в Rust
Представь, что ты создаешь программу, которая общается с пользователем. Чтобы программа могла понять, что хочет человек, ей нужно ввести данные (например, имя или число). А чтобы пользователь увидел результат работы программы, она должна вывести ответ на экран. В Rust для этого есть специальные команды: println! для вывода и std::io::stdin для ввода.
Как выводить текст на экран
Самая простая команда для вывода — println!. Она печатает текст и автоматически переходит на новую строку.
fn main() {
println!("Привет, мир!");
println!("Я учу Rust!");
}
Если ты хочешь вывести число или переменную, используй фигурные скобки {} — это плейсхолдер, куда подставляется значение:
fn main() {
let имя = "Аня";
let возраст = 12;
println!("Меня зовут {}, мне {} лет.", имя, возраст);
}
Можно выводить результат вычислений прямо в println!:
fn main() {
println!("5 + 3 = {}", 5 + 3);
println!("10 / 2 = {}", 10 / 2);
}
Как вводить данные от пользователя
Ввод данных в Rust немного сложнее, чем в других языках, но ничего страшного! Сначала нужно подключить библиотеку ввода-вывода:
use std::io;
Потом создаем переменную для хранения введенного текста и считываем строку:
use std::io;
fn main() {
let mut ввод = String::new(); // создаем пустую строку
io::stdin()
.read_line(&mut ввод) // читаем то, что написал пользователь
.expect("Ошибка чтения"); // если что-то пошло не так — программа завершится
println!("Вы ввели: {}", ввод);
}
Обрати внимание: let mut — это изменяемая переменная, потому что мы будем менять ее содержимое. &mut — это ссылка на переменную, чтобы функция read_line могла записать в нее данные.
Ввод чисел
Когда пользователь вводит число, Rust воспринимает его как текст. Чтобы работать с числом, нужно преобразовать строку в число с помощью .trim().parse():
use std::io;
fn main() {
let mut ввод = String::new();
println!("Введите ваш возраст:");
io::stdin().read_line(&mut ввод).expect("Ошибка");
let возраст: u32 = ввод
.trim() // убираем лишние пробелы и перевод строки
.parse() // превращаем строку в число
.expect("Введите число!"); // если не число — ошибка
println!("Через год вам будет {} лет.", возраст + 1);
}
.trim() нужен, чтобы удалить символ перевода строки, который добавляется при нажатии Enter. .parse() пытается превратить текст в число. Тип u32 — это целое положительное число.
Разбор типичных задач
Давай разберем, как решать задачи из твоего списка.
Пример: Площадь прямоугольника
Программа должна запросить длину и ширину, а потом вывести площадь. Нужно два раза считать числа и перемножить их:
use std::io;
fn main() {
let mut ввод = String::new();
println!("Введите длину прямоугольника:");
io::stdin().read_line(&mut ввод).expect("Ошибка");
let длина: f64 = ввод.trim().parse().expect("Введите число");
ввод.clear(); // очищаем переменную для нового ввода!
println!("Введите ширину прямоугольника:");
io::stdin().read_line(&mut ввод).expect("Ошибка");
let ширина: f64 = ввод.trim().parse().expect("Введите число");
let площадь = длина * ширина;
println!("Площадь прямоугольника: {}", площадь);
}
Обрати внимание на ввод.clear() — это очень важно! Если не очистить строку, новый ввод добавится к старому.
Пример: Определение возраста
Запрашиваем год рождения и текущий год, вычитаем из текущего год рождения:
use std::io;
fn main() {
let mut ввод = String::new();
println!("Введите год рождения:");
io::stdin().read_line(&mut ввод).expect("Ошибка");
let год_рождения: u32 = ввод.trim().parse().expect("Введите число");
ввод.clear();
println!("Введите текущий год:");
io::stdin().read_line(&mut ввод).expect("Ошибка");
let текущий_год: u32 = ввод.trim().parse().expect("Введите число");
let возраст = текущий_год - год_рождения;
println!("Вам {} лет (или будет в этом году).", возраст);
}
Частые ошибки новичков
- Забыл очистить строку перед новым вводом. Используй
переменная.clear();перед каждымread_line, если считываешь несколько значений. - Забыл
.trim()при преобразовании в число. Без.trim()строка содержит символ новой строки, и.parse()может не сработать. - Попытался ввести текст как число. Если пользователь введет "привет" вместо числа, программа упадет с ошибкой. В следующих уроках ты узнаешь, как обрабатывать такие ситуации.
- Забыл
use std::io;. Без этой строчки компилятор не поймет, что такоеio::stdin(). - Использовал
letвместоlet mut. Переменная для ввода должна быть изменяемой, иначе ты не сможешь записать в нее данные.
Итоговый пример: "Уютное кафе"
Давай напишем программу, которая принимает заказ в кафе. Пользователь вводит имя, напиток и размер порции, а программа выводит итоговый заказ.
use std::io;
fn main() {
let mut ввод = String::new();
// Вводим имя
println!("Добро пожаловать в 'Уютное кафе'!");
println!("Как вас зовут?");
io::stdin().read_line(&mut ввод).expect("Ошибка");
let имя = ввод.trim().to_string(); // сохраняем имя
ввод.clear();
// Вводим напиток
println!("Какой напиток желаете? (кофе, чай, какао)");
io::stdin().read_line(&mut ввод).expect("Ошибка");
let напиток = ввод.trim().to_string();
ввод.clear();
// Вводим размер
println!("Какой размер? (маленький, средний, большой)");
io::stdin().read_line(&mut ввод).expect("Ошибка");
let размер = ввод.trim().to_string();
// Выводим заказ
println!("
--- ВАШ ЗАКАЗ ---
Имя: {}
Напиток: {}
Размер: {}
------------------", имя, напиток, размер);
println!("Спасибо, {}, ждите ваш {} {}!", имя, размер, напиток);
}
Эта программа использует все, что мы изучили: вывод с println!, ввод с read_line, очистку строки и подстановку переменных в текст.
Теперь ты знаешь основы ввода и вывода в Rust. Практикуйся: попробуй изменить примеры, добавить новые вопросы или вычисления. С каждым новым кодом ты будешь чувствовать себя увереннее!