Rust 为什么变量的寿命不够长?

Rust 为什么变量的寿命不够长?,rust,object-lifetime,lifetime,Rust,Object Lifetime,Lifetime,考虑这个函数,它应该返回给定路径的文件扩展名 pub fn get_扩展选项这不是一个bug。这里的“问题”是“问题”的定义。它获取对其参数的引用,并返回一个与引用具有相同生存期的&str,因此它不能内省调用它的任何类型的内部生存期。也就是说,path\u str.as\u slice()返回一个持续时间与path\u str相同的&str,而不是数据path\u str指向的时间(原始路径) 换句话说,这里有两个生命周期。我将在@Arjan's的示例上使用假设的块生命周期注释语法(这个答案基于

考虑这个函数,它应该返回给定
路径的文件扩展名

pub fn get_扩展选项这不是一个bug。这里的“问题”是“问题”的定义。它获取对其参数的引用,并返回一个与引用具有相同生存期的
&str
,因此它不能内省调用它的任何类型的内部生存期。也就是说,
path\u str.as\u slice()
返回一个持续时间与
path\u str
相同的
&str
,而不是数据
path\u str
指向的时间(原始
路径

换句话说,这里有两个生命周期。我将在@Arjan's的示例上使用假设的块生命周期注释语法(这个答案基于)

fn测试&a str{
“b:{
let slice:&'a str=s.as_slice();
slice.as_slice()
}
}
对于第二个
as_slice
调用,我们有
self:&'b&'a str
,因此它返回
&'b str
,这太短了:
'b
只是
测试的局部



正如您所发现的,现在的修复程序只是删除无关的
As_slice
调用。但是,使用,我们将能够为str编写
impl StrSlice
,然后编写
slice。as_slice()
将返回一个
&'a str
,因为不会有额外的引用层(即,
self:&'a str
)。

Path_str已经是一个slice,所以您可以将其作为slice删除,并且它会工作。这可能是个bug,谢谢。这就成功了。我相应地更新了这个问题。因此,对于Str-trait:,有了这个等价的定义,这个类型的签名怎么不是谎言?@Arjan哪个类型的签名<代码>fn作为第二条和第二条?是的,它声称它用生命“a”来回报某物,但*自我是生命“b”。或者它是否推断“a&b self
self
指向的数据至少对
'b
完全有效,这意味着
&a str
必须至少有效那么长时间,因此
'b说明了引用在实践中是如何工作的。您进行引用的位置(在本例中,您调用它进行
&self
)的方法)是该引用的“锚定点”。
fn test<'a>(s: &'a String) -> &'a str {
    'b: {
        let slice: &'a str = s.as_slice();
        slice.as_slice()
    }
}