如何在将数值推入向量后继续使用它?

3

我想在将一个值推入向量后继续使用它,但是当我将其添加到向量中时,向量会控制该变量的所有权,因此当我再次引用该值时无法访问。我应该如何处理这种情况?

fn scan_recursive(dir: &Path) -> io::Result<Vec<PathBuf>> {
    let mut files = Vec::new(); // Create a mutable vector to store the files.

    for entry in fs::read_dir(dir)? {
        let entry = entry?;
        let path = entry.path();

        if path.is_file() {
            files.push(path);
        }

        if path.is_dir() { // ERROR: path is no longer valid
            files.append(&mut scan_recursive(&path)?);
        }
    }

    Ok(files)
}
1个回答

3
问题在于编译器无法确定第一个 if 是否被执行,也无法判断是否使用了 path 变量,因此它会假定 path 变量总是被使用,并且在向 vector 中添加后,path 的生命周期就结束了。
考虑到你的两个 if 是互斥的(即 path 要么是文件,要么是目录),你可以使用 if ... else,这将让编译器推断如果 path 不是文件,则变量在 if 分支中没有被使用,并且它仍然可用于 else 分支。
if path.is_file() {
  files.push(path);
}
else if path.is_dir() {
  files.append(&mut scan_recursive(&path)?);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接