Как вывести на экран содержимое вектора (Vec) в Rust?
Проблема: трейт Display vs Debug
Ошибка возникает потому, что в Rust макрос println! требует, чтобы тип реализовывал трейт Display (для форматирования через {}). Вектор Vec<T> не реализует Display, так как нет единственного "правильного" способа отобразить коллекцию — можно вывести элементы через запятую, в квадратных скобках, построчно и т.д. Зато вектор реализует трейт Debug (для форматирования через {:?}), который предназначен для отладки и выводит структуру "как есть".
Решение 1: Использовать {:?} (самое простое)
Просто замените {} на {:?} в макросе println!:
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
println!("Мой вектор: {:?}", numbers);
}
Вывод:
Мой вектор: [1, 2, 3, 4, 5]
Это самый быстрый способ для отладки. Если хотите красивее — используйте {:#?} ("pretty-print"):
println!("Мой вектор: {:#?}", numbers);
Вывод:
Мой вектор: [
1,
2,
3,
4,
5,
]
Решение 2: Ручной перебор элементов
Если нужно больше контроля (например, другой разделитель или формат):
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
print!("Мой вектор: [");
for (i, num) in numbers.iter().enumerate() {
if i > 0 {
print!(", ");
}
print!("{}", num);
}
println!("]");
}
Вывод: Мой вектор: [1, 2, 3, 4, 5]
Решение 3: Использовать итератор и join (для строк)
Если вектор содержит строки или типы, реализующие Display:
fn main() {
let words = vec!["hello", "world", "rust"];
println!("Слова: {}", words.join(", "));
}
Вывод: Слова: hello, world, rust
Для чисел нужно сначала преобразовать в строки:
let numbers = vec![1, 2, 3, 4, 5];
let result: Vec<String> = numbers.iter().map(|n| n.to_string()).collect();
println!("Числа: {}", result.join(", "));
Почему так сложно?
Rust строг в отношении форматирования. Display ({}) предназначен для "пользовательского" вывода (например, числа 42), а Debug ({:?}) — для отладки. Коллекции не реализуют Display, чтобы вы сами решили, как их показывать. Для повседневной отладки просто используйте {:?} — это стандартный подход в Rust.
Краткая шпаргалка
{}— требуетDisplay(не работает сVec){:?}— требуетDebug(работает сVecи большинством стандартных типов){:#?}— красивый вывод с отступами- Ручной перебор — полный контроль над форматом
Совет: для отладки всегда используйте {:?} или {:#?}, это сэкономит вам кучу времени.
Альтернативный подход: макрос dbg!
Если вы просто хотите быстро отладить код и посмотреть значение переменной, используйте макрос dbg!. Он выводит имя переменной, её значение и место в коде (файл и строку). Это удобнее, чем println!, для временной отладки:
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
dbg!(&numbers); // обратите внимание на амперсанд
// или dbg!(numbers); если владение не важно
}
Вывод (в stderr):
[src/main.rs:3] &numbers = [
1,
2,
3,
4,
5,
]
dbg! использует Debug-форматирование и автоматически показывает путь к файлу и номер строки. После отладки просто удалите или закомментируйте эти строки. Этот макрос также возвращает значение аргумента, поэтому его можно встраивать в выражения:
let doubled: Vec<i32> = numbers.iter().map(|n| dbg!(n * 2)).collect();
Это позволит увидеть промежуточные результаты без изменения логики программы.
Ответов пока нет.
Войдите чтобы оставить ответ