考虑这个应该返回给定文件扩展名的函数Path.
pub fn get_extension<'a>(path: &'a Path) -> Option<&'a str> {
let path_str = path.as_str().unwrap();
let ext_pos = regex!(".[a-z0-9]+$").find(path_str);
match ext_pos {
Some((start, _)) => {
return Some(path_str.as_slice().slice_from(start))
},
None => return None
}
}
Run Code Online (Sandbox Code Playgroud)
错误消息如下:
`path_str` does not live long enough
Run Code Online (Sandbox Code Playgroud)

错误信息很清楚,很遗憾我无法自己解决这个问题.我在理论上理解它,但对我来说还有一些模糊的东西.
据我所知,编译器想告诉我,path_str活动时间不够长,因为返回值标记为生命周期'a.
但这就是它停止的地方:
据我所知,对path(输入参数)的引用应该与str对Option(包含在输出参数中)的引用完全一样长
因为我们回来了,Some(path_str.as_slice().slice_from(start))我认为在实践中,这意味着只path_str需要生活path.
我不明白的是到底为什么不path_str不活足够长的时间,我怎么能解决这个问题?是什么让它很快死去?
UPDATE
正如在评论中指出的那样以及IRC中删除superflous as_slice()使代码编译.有谁知道那是为什么?还有人指出存在一种直接获得扩展的方法.但是,我实际上更感兴趣的是学习问题背后的故事.
我想编写一个函数,该函数将反转字符串并返回对返回的字符串的引用。我以为我可以指定返回的引用与提供的引用具有相同的生存期。
fn reverse_string<'a>(input: &'a str) -> &'a str {
let res: &'a str = input.chars().rev().collect().as_slice();
res
}
Run Code Online (Sandbox Code Playgroud)
这是我的尝试,并且收到错误消息:
fn reverse_string<'a>(input: &'a str) -> &'a str {
let res: &'a str = input.chars().rev().collect().as_slice();
res
}
Run Code Online (Sandbox Code Playgroud)
我以为类型规范可以解决这个问题。生命对我来说有些混乱,所以我希望有人能够解释如何正确执行此操作,或者我是否一开始就完全不了解。