- Стандартная библиотека
join
определена только для слайсов, поэтому работает следующий код:
let books: &[_] = &["1", "2", "3"];
let n_books: usize = 2;
let result = books[0..n_books].join(" ");
println!("{}", result); // "1 2"
Вы не можете присоединиться к
usize
со строкой:
.join(" ")
.
Вам необходимо сначала преобразовать
usize
в строку, а затем присоединиться к ней:
map(|u| u.to_string())
Из вашего комментария:
Когда я только добавляю карту: "ошибка [E0599]: не найден метод с именем map для типа [usize] в текущей области"
Поскольку map()
преобразует один итератор в другой, вы должны сначала предоставить итератор, например:
fn main() {
let books: Vec<usize> = vec![1, 2, 3];
let n_books: usize = 2;
let result = books[0..n_books]
.iter()
.map(|u| u.to_string())
.collect::<Vec<_>>()
.join(" ");
println!("{}", result); //"1 2"
}
В чем разница, используя take(n)
или оператор нижнего индекса (повторная нарезка books[0..n_books]
)
Срез представляет собой struct
тип, состоящий из длины и указателя на память.
Вы можете использовать .take(n_books)
вместо повторного среза, который является итератором, который повторяется только в течение первых n
итераций iter
:
let books: Vec<usize> = vec![1, 2, 3];
let n_books: usize = 2;
let result = books
.iter()
.take(n_books)
.map(|u| u.to_string())
.collect::<Vec<_>>()
.join(" ");
println!("{}", result); //"1 2"