语境

无法使此功能正常工作.我相信我明白这些错误试图告诉我什么,但我不明白我是如何犯下这些错误/如何解决它们的.

该函数是一个递归函数,它查看一个目录及其子目录,并累积路径的一个向量和一个Axum方法路由(我认为这与我面临的实际问题没有任何关系).

误差率

编译器错误状态为"无法返回引用局部变量path的值."

如果我用path.clone().to_str()替换path.to_str(),错误变成"Cannot Return Value Refering Temporary Value".

代码

fn assign_handlers(dir: Option<&str>) -> Vec<(&str, MethodRouter)> {
    //Check root dir validity
    let dir = match dir {
        Some(s) => s,
        None => return vec![],
    };

    //Look for routes in dir
    let dir_path = fs::read_dir(dir).expect(&format!("Unable to access directory '{}'", &dir));
    let mut routes = Vec::new();
    for entry in dir_path {
        match entry {
            Ok(entry) => {
                let path = entry.path();
                if path.is_dir() {
                    //Recurse into subdirectories
                    let subroutes = assign_handlers(path.to_str());
                    for route in subroutes {
                        routes.push(route)
                    }
                } else if path.is_file() {
                    // Cut for brevity (and because I don't know what goes here yet)
                }
            },
            Err(_) => {},
        }
    }

    routes
}

推荐答案

铁 rust 是正确的.让我们解码&str:&表示它是一个引用,str表示它是一个字符串的内容.在垃圾收集语言中,引用使对象保持活动状态,这很方便,但Rust做出了一个不同的 Select ,它通常更快、内存效率更高,并且可以用来查找编译器在其他语言中会允许的许多错误:引用不会使对象保持活动状态.

这就是编译器告诉您的:根据定义,temporary值是一个一旦您离开块就不再存在的值.由于您在函数中指定的返回类型包含&str,因此编译器信任您并假定subroutes包含临时值,并且您正在try 返回它们.由于不能返回临时值,因此会出现错误.

因此,您应该做的是返回一些可以保证存活的东西.例如,这可能是String分.除了,在这种情况下,你已经有了一些活着的东西:PathBuf--这相当于String,除了它按照你的操作系统的要求使用你的文件系统的编码(许多语言把PathBufString混淆了--这使得用这些语言编写的大多数应用程序在日本、韩国或中国都无法使用).

通过这些更改,您将获得:

fn assign_handlers(dir: Option<&Path>) -> Vec<(PathBuf, MethodRouter)> {
    //Check root dir validity
    let dir = match dir {
        Some(s) => s,
        None => return vec![],
    };

    //Look for routes in dir
    let dir_path = fs::read_dir(dir).expect(&format!("Unable to access directory '{:?}'", &dir));
    let mut routes = Vec::new();
    for entry in dir_path {
        match entry {
            Ok(entry) => {
                let path = entry.path();
                if path.is_dir() {
                    //Recurse into subdirectories
                    let subroutes = assign_handlers(Some(&path));
                    for route in subroutes {
                        routes.push(route)
                    }
                } else if path.is_file() {

                }
            },
            Err(_) => {},
        }
    }

    routes
}

我也不知道你为什么会超过Option<&PathBuf>分.我建议只通过&PathBuf.这将使代码简化一点.

Rust相关问答推荐

为什么对不可复制数据的引用的取消引用没有O权限来避免Rust中的双重释放?

如何从铁 rust 中呼唤_mm_256_mul_ph?

在Rust中是否可以使用Rc自动化约束传播

在使用AWS SDK for Rust时,如何使用硬编码访问密钥ID和密钥凭据?

Rust 的多态现象.AsRef与Derf

在运行特定测试时,如何 suppress cargo test 的空输出?

对reqwest提供的这种嵌套JSON struct 进行反序列化

装箱特性如何影响传递给它的参数的生命周期 ?(举一个非常具体的例子)

确保参数是编译时定义的字符串文字

为什么 Rust 需要可变引用的显式生命周期而不是常规引用?

需要哪些编译器优化来优化此递归调用?

.to_owned()、.clone() 和取消引用 (*) 之间有区别吗?

‘&T as *const T as *mut T’ 在 ‘static mut’ 项目中合适吗?

为什么需要同时为值和引用实现`From`?方法不应该自动解引用或borrow 吗?(2023-06-16)

Rust与_有何区别?

Rust 程序中的内存泄漏

在 Rust 中,我如何处理请求 javascript 的页面?

判断对象是 PyDatetime 还是 Pydate 的实例?

如何使用 rust bindgen 生成的 std_vector

相交着色器从 SSBO 中读取零