无法正常使用此功能。我相信我明白这些错误试图告诉我什么,但我不明白我是如何犯下这些错误的/如何解决它们。
该函数是一个递归函数,它遍历目录及其子目录并累积路径向量和 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
}
铁锈是正确的。让我们解码
&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
。这会稍微简化代码。