Как решить "не может выйти из заимствованного содержимого" из-за фильтрации вывода read_dir? - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь использовать read_dir, чтобы прочитать содержимое каталога, а затем отфильтровать только файлы:

let xs = std::fs::read_dir(".")?
    .filter(|r_entry| {
        r_entry.and_then(|entry| {
            let m = entry.metadata()?;
            Ok(m.is_file())
        })
        .unwrap_or(false)
    })
    .collect::<Result<Vec<_>>>();

( детская площадка )

Сообщение об ошибке:

error[E0507]: cannot move out of borrowed content
 --> src/main.rs:6:13
  |
6 |             r_entry
  |             ^^^^^^^ cannot move out of borrowed content

Я пробовал различные комбинации & и * вокруг r_entry, но безрезультатно.Что происходит?

1 Ответ

1 голос
/ 29 мая 2019

Предикат в filter позволяет вам брать только r_entry.Когда вы звоните and_then, это пытается двигаться.Вместо этого вы можете использовать ссылку в match, например:

fn main() -> Result<()> {
    let xs = std::fs::read_dir(".")?
        .filter(|r_entry| match r_entry {
            Ok(entry) => entry.metadata().map(|m| m.is_file()).unwrap_or(false),
            Err(_) => false,
        })
        .collect::<Result<Vec<_>>>();

    println!("{:?}", xs);
    Ok(())
}
...