Rust 函数的返回值不能引用本地或临时变量

问题描述 投票:0回答:1

背景

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

该函数是一个递归函数,它遍历目录及其子目录并累积路径向量和 Axum MethodRouter (我不认为这对我面临的实际问题有任何影响)。

错误

编译器错误指出“无法返回引用局部变量的值

path
。”

如果我将

path.to_str()
替换为
path.clone().to_str()
,错误将变为“无法返回引用临时值的值。”

代码

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() {

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

    routes
}
rust borrow-checker
1个回答
0
投票

铁锈是正确的。让我们解码

&str
&
表示它是引用,
str
表示它是字符串的内容。在垃圾收集语言中,引用使对象保持活动状态,这很方便,但 Rust 做出了不同的选择,通常更快,内存效率更高,并且可以用于查找编译器会忽略的大量错误在其他语言中:引用不会使对象保持活动状态。

这就是编译器告诉您的内容:根据定义,“临时”值是指一旦离开该块就不再存在的值。 因此,您应该做的是返回保证存活的东西。例如,这可能是

String

。除非,在这种情况下,您已经拥有了一些活着的东西:a

PathBuf
- 相当于
String
,除了它根据操作系统的要求使用文件系统的编码(许多语言混淆了
PathBuf 
String
– 这使得大多数用这些语言编写的应用程序在日本、韩国或中国无法使用)。
通过这些更改,您将获得:

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
。这会稍微简化代码。
    

© www.soinside.com 2019 - 2024. All rights reserved.