Как разрешить «невозможно удалить заимствованный контент» из-за фильтрации вывода read_dir?

Я пытаюсь использовать 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 безрезультатно. Что происходит?

play.rust-lang.org/… выберите свой любимый
Stargateur 29.05.2019 07:19
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
1
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предикат в 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(())
}

Другие вопросы по теме

Похожие вопросы