如何在将值推入向量后继续使用它?
How to keep using a value after pushing it into a vector?
所以我想在将值推入向量后继续使用它,但是当我将它添加到向量时它会控制变量的所有权,所以当我想再次引用它时我不能.我应该如何处理这种情况?
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)
}
问题是编译器不知道第一个if
是否被执行,也无法判断path
变量是否被消耗,所以它假设它一直是,并且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)?);
}
所以我想在将值推入向量后继续使用它,但是当我将它添加到向量时它会控制变量的所有权,所以当我想再次引用它时我不能.我应该如何处理这种情况?
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)
}
问题是编译器不知道第一个if
是否被执行,也无法判断path
变量是否被消耗,所以它假设它一直是,并且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)?);
}