Rust 我如何理解这个借值错误?建立Vec<&;PathBuf>; 我如何理解我违反了借阅检查程序的哪一部分?

Rust 我如何理解这个借值错误?建立Vec<&;PathBuf>; 我如何理解我违反了借阅检查程序的哪一部分?,rust,lifetime,borrow-checker,Rust,Lifetime,Borrow Checker,因为Rust的标准库walk_dir是(从2015年9月27日起),我想我应该尝试构建自己的函数来获取目录中的所有文件及其子目录 以下是我仅列出目录中的文件,而不查看子目录部分的结果: use std::fs::File; use std::path::{Path,PathBuf}; fn get_files(this_path: &Path) -> Vec<&PathBuf>{ let contents = fs::read_dir(this_pat

因为Rust的标准库
walk_dir
是(从2015年9月27日起),我想我应该尝试构建自己的函数来获取目录中的所有文件及其子目录

以下是我仅列出目录中的文件,而不查看子目录部分的结果:

use std::fs::File;
use std::path::{Path,PathBuf};

fn get_files(this_path: &Path) -> Vec<&PathBuf>{
    let contents = fs::read_dir(this_path).unwrap();
    let mut output: Vec<&PathBuf> = Vec::new();

    for path in contents {
        let p = path.unwrap().path();
        if fs::metadata(&p).unwrap().is_dir() {
            // dunno, recursively append files to output 
        } else if fs::metadata(&p).unwrap().is_file() {
            output.push(&p)
        }
    }

    return output;
}

fn main() {
    for f in get_files(Path::new(".")) {
        println!("{}", f.display())
    }
}
使用std::fs::File;
使用std::path::{path,PathBuf};
fn获取文件(此路径:&path)->Vec{
让contents=fs::read_dir(此路径).unwrap();
让mut输出:Vec=Vec::new();
对于目录中的路径{
设p=path.unwrap().path();
如果fs::metadata(&p).unwrap()是_dir(){
//不知道,递归地将文件追加到输出
}如果fs::metadata(&p).unwrap()是_文件(){
输出推送(&p)
}
}
返回输出;
}
fn main(){
对于get_文件中的f(路径::new(“.”){
println!(“{}”,f.display())
}
}
当我尝试运行此代码时,出现以下错误:

src/main.rs:58:26: 58:27 error: `p` does not live long enough
src/main.rs:58             output.push(&p)
                                        ^
note: in expansion of for loop expansion
src/main.rs:53:5: 60:6 note: expansion site
src/main.rs:49:48: 63:2 note: reference must be valid for the anonymous lifetime #1 defined on the block at 49:47...
src/main.rs:49 fn get_files(this_path: &Path) -> Vec<&PathBuf>{
src/main.rs:50     let contents = fs::read_dir(this_path).unwrap();
src/main.rs:51     let mut output: Vec<&PathBuf> = Vec::new();
src/main.rs:52
src/main.rs:53     for path in contents {
src/main.rs:54         let p = path.unwrap().path();
               ...
src/main.rs:54:38: 60:6 note: ...but borrowed value is only valid for the block suffix following statement 0 at 54:37
src/main.rs:54         let p = path.unwrap().path();
src/main.rs:55         if fs::metadata(&p).unwrap().is_dir() {
src/main.rs:56             // dunno, recursively append files to output
src/main.rs:57         } else if fs::metadata(&p).unwrap().is_file() {
src/main.rs:58             output.push(&p)
src/main.rs:59         }
               ...
error: aborting due to previous error
src/main.rs:58:26:58:27错误:`p`活得不够长
src/main.rs:58输出.推送(&p)
^
注:在循环扩展的扩展中
src/main.rs:53:5:60:6注:扩建场地
src/main.rs:49:48:63:2注意:引用必须对49:47在块上定义的匿名生存期#1有效。。。
src/main.rs:49 fn get_文件(此路径:&path)->Vec{
src/main.rs:50 let contents=fs::read_dir(此路径).unwrap();
src/main.rs:51让mut输出:Vec=Vec::new();
src/main.rs:52
src/main.rs:53表示目录中的路径{
src/main.rs:54让p=path.unwrap().path();
...
src/main.rs:54:38:60:6注:……但借用值仅对54:37处语句0后面的块后缀有效
src/main.rs:54让p=path.unwrap().path();
src/main.rs:55如果fs::metadata(&p).unwrap()是_dir(){
src/main.rs:56//dunno,递归地将文件追加到输出
src/main.rs:57}如果fs::metadata(&p).unwrap().is_file(),则为else{
src/main.rs:58输出.推送(&p)
src/main.rs:59}
...
错误:由于上一个错误而中止
如果我错了,请纠正我,但我有一个非常松散的理解,即Rust的一个很酷的特性是,您必须明确声明对象应该在函数作用域之后存在的时间。我认为我的问题是在
let p=path.unwrap().path()中创建的
PathBuf
在for循环的迭代结束时被丢弃,因此
输出
Vec
包含对已消失的内容的引用

如果是这样的话:

当我做这样愚蠢的事情时,我如何建立更好的直觉? 有没有更好的惯用方法从返回生命周期有限的资源的函数中构建元素向量?这里的直觉是:

我无法返回对函数内部创建的内容的引用,因为它将在该函数结束时被释放,从而使引用无效

相反,您必须将该内容移出。因此
Vec
Vec
的自有变量(因为
PathBuf
&PathBuf
的自有变量)应该是您的返回类型。

这里的直觉是:

我无法返回对函数内部创建的内容的引用,因为它将在该函数结束时被释放,从而使引用无效

相反,您必须将该内容移出。因此
Vec
Vec
的自有变量(因为
PathBuf
&PathBuf
的自有变量)应该是您的返回类型。

这里的直觉是:

我无法返回对函数内部创建的内容的引用,因为它将在该函数结束时被释放,从而使引用无效

相反,您必须将该内容移出。因此
Vec
Vec
的自有变量(因为
PathBuf
&PathBuf
的自有变量)应该是您的返回类型。

这里的直觉是:

我无法返回对函数内部创建的内容的引用,因为它将在该函数结束时被释放,从而使引用无效


相反,您必须将该内容移出。因此
Vec
Vec
的自有变量(因为
PathBuf
&PathBuf
的自有变量)应改为您的返回类型。

ohhh,“自有变量&PathBuf”是“PathBuf”?哎呀!我认为移动堆栈溢出编辑了我的s,让我编辑一下,所以通过返回所拥有的变体,所有权被转移到我的
get_文件的调用者那里,这就是我的意图。这感觉很好!这就是为什么Rust很酷,编译器刚刚用另一种语言的悬空指针将您从运行时错误中解救出来。OHHHH,则“拥有的&PathBuf变体”为“PathBuf”?哎呀!我认为移动堆栈溢出编辑了我的s,让我编辑一下,所以通过返回所拥有的变体,所有权被转移到我的
get_文件的调用者那里,这就是我的意图。这感觉很好!这就是为什么Rust很酷,编译器刚刚用另一种语言的悬空指针将您从运行时错误中解救出来。OHHHH,则“拥有的&PathBuf变体”为“PathBuf”?哎呀!我认为移动堆栈溢出编辑了我的s,让我编辑一下,所以通过返回所拥有的变体,所有权被转移到我的
get_文件的调用者那里,这就是我的意图。这感觉很好!这就是为什么Rust很酷,编译器刚刚用另一种语言的悬空指针将您从运行时错误中解救出来。OHHHH,而“拥有的&PathBuf变体”是“PathBuf”?哎呀!我想移动堆栈溢出把我的s编辑掉了,让我来看看