Почему я получаю "метод с именем` join` не найден для типа `[usize]` в текущей области "? - PullRequest
1 голос
/ 25 февраля 2020
fn example(books: Vec<usize>, n_books: usize) {
    let fbooks = books[0..n_books].join(" ");
}
error[E0599]: no method named `join` found for type `[usize]` in the current scope
 --> src/lib.rs:2:36
  |
2 |     let fbooks = books[0..n_books].join(" ");
  |                                    ^^^^ method not found in `[usize]`

Я попытался сопоставить usize с String, собрать в Vec и еще несколько случайных вещей. Я не понимаю, что происходит.

1 Ответ

1 голос
/ 25 февраля 2020
  1. Стандартная библиотека 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...