我正在努力更好地理解&mut self的生命周期省略和相应的输出参数。
假设我有这个表格的函数签名
fn foo(&mut self) -> &mut bar从生词符号中的生存期部分。我了解到它被扩展到
fn foo<'a>(&'a mut self) -> &'a mut bar它的副作用是,只要存在相应的对象,self就会不断地被借来。
我想知道的是,如果我指定一个有签名的函数,会发生什么?
fn foo<'a>(&mut self) -> &'a mut bar据我理解,&mut self被省略,并且根据省略规则获得它自己的输入生命周期。所以我们最终的结果是
fn foo<'b, 'a>(&'b mut self) -> &'a mut bar根据省略规则,'b被分配给所有被省略的输出生命周期。但是'a并没有被剥夺。那么,生命周期'a是什么?具有这样一个签名的代码编译得很好。但我不太明白'a一生的意义。
发布于 2022-07-30 22:36:46
你正确地没有对生命进行评估。
那么,生命周期
'a是什么?
每当一个函数有一个生存期参数时,它总是:“调用者希望它是什么”(受边界约束,在本例中没有)。
具有这样一个签名的代码编译得很好。
你试过为这个功能写一个身体吗?考虑到这些生命,它实际上不能做很多事情。例如,
impl Foo {
fn foo<'b, 'a>(&'b mut self) -> &'a mut Bar {
&mut self.bar
}
}将无法编译错误告诉您(间接),这是有效的,只有当'b超过'a,但它没有。
如果将“超过”的关系添加到签名中,则代码可以编译:
impl Foo {
fn foo<'b, 'a>(&'b mut self) -> &'a mut Bar
where
'b: 'a
{
&mut self.bar
}
}然而,这几乎没有比简单的更有用的了。
fn foo<'a>(&'a mut self) -> &'a mut Bar {因为引用通常可以被用作比它们的类型指定的生命周期更短的引用,所以这里的'a可以在更复杂的声明中服务于'a的目的和'b的目的。
发布于 2022-07-30 23:04:26
与任何其他泛型参数一样,只要'a满足该特征的任何泛型界限(在您的示例中没有任何通用边界),调用方就可以自由选择它。就像你有一种
// caller chooses the value of B in `fn collect<B>(self) -> B` to be Vec<_>
let items: Vec<_> = my_data.into_iter().collect();你可以拥有
// caller chooses the value of 'a in `fn foo<'a>(&mut self) -> &'a mut bar` to be 's
's: {
let b = obj.foo()
}当然,如果Rust不能证明调用方确实可以自由选择foo,那么Rust甚至都不会编译'a,这意味着在没有其他生存期限制的情况下,我们必须拥有'a: 'static,而foo的主体必须与此兼容。
https://stackoverflow.com/questions/73179113
复制相似问题