考虑这个函数,它应该返回给定的文件扩展名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
}
}
错误信息如下:
`path_str` does not live long enough
错误消息非常清楚,遗憾的是我无法自己解决它。我在理论上理解它,但对我来说仍然有一些模糊的事情。
我知道编译器想告诉我path_str
生命周期不够长,无法有效,因为返回值被标记为生命周期'a
.
但这对我来说就停止了:
我不明白的是到底为什么 does path_str
活得不够长,我该如何解决这个问题?是什么让它很快死去?
UPDATE
正如评论和 IRC 中指出的,删除了多余的内容as_slice()
使代码编译。有谁知道这是为什么?也有人指出,存在一个method直接获取扩展名。但是,是的,我实际上更感兴趣的是了解问题背后的故事。
这不是一个错误。这里的“问题”是as_slice的定义。它需要对其参数的引用,并返回一个&str
与相同的寿命参考,它无法内省所调用的任何类型的内部生命周期。那是,path_str.as_slice()
返回一个&str
持续时间只要path_str
, not只要数据path_str
指向(原来的Path
).
换句话说,这里有两辈子。我将在 @Arjan 的示例中使用假设的块生命周期注释语法提交错误(这个答案是基于我的回应).
fn test<'a>(s: &'a String) -> &'a str {
'b: {
let slice: &'a str = s.as_slice();
slice.as_slice()
}
}
对于第二个as_slice
打电话给我们self: &'b &'a str
,因此它返回&'b str
,太短了:'b
只是本地的test
.
正如您所发现的,现在的修复只是删除无关的as_slice
称呼。然而,随着动态调整大小的类型 (DST),我们将能够写出impl StrSlice for str
, 进而slice.as_slice()
will正在返回一个&'a str
,因为不会有额外的引用层(即self: &'a str
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)