Как сделать flat_map и отделить его от итератора строк - PullRequest
0 голосов
/ 08 декабря 2018

Есть ли способ заставить эту работу работать без использования iter вместо into_iter?

let strings: Vec<String> = vec!["1 2".to_string(), "3 4".to_string()];
strings.into_iter().flat_map(|str| str.split(" "));

Проблема в

error[E0515]: cannot return value referencing function parameter `str`
 --> src/lib.rs:3:40
  |
3 |     strings.into_iter().flat_map(|str| str.split(" "));
  |                                        ---^^^^^^^^^^^
  |                                        |
  |                                        returns a value referencing data owned by the current function
  |                                        `str` is borrowed here

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

1 Ответ

0 голосов
/ 08 декабря 2018

Проблема с вашим кодом заключается в том, что вы выполняете следующие действия:

  1. Вы используете свой вектор с into_iter
  2. Таким образом, внутри замыкания вы принимаетеString по значению, которое вы заимствуете у split
  3. Во временном итераторе вы храните ссылку на эту строку

Вывод: вы пытаетесь вернуть ссылку налокальная переменная.

Чтобы решить эту проблему, вы должны создать собственные строки из разделенной строки и собрать их, чтобы они больше не содержали ссылки:

fn main() {
    let strings = vec!["1 2".to_string(), "3 4".into()];
    let result = strings.into_iter().flat_map(|str| str.split(" ").map(str::to_owned).collect::<Vec<_>>());

    println!("{:?}", result.collect::<Vec<_>>());
}

На самом деле это будет меньшедорого не потреблять вектор сначала:

fn main() {
    let strings = vec!["1 2".to_string(), "3 4".into()];
    let result = strings.iter().flat_map(|str| str.split(" ")).map(str::to_owned);

    println!("{:?}", result.collect::<Vec<_>>());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...