首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数的自变量和输出值的寿命省略

函数的自变量和输出值的寿命省略
EN

Stack Overflow用户
提问于 2022-07-30 21:17:42
回答 2查看 58关注 0票数 2

我正在努力更好地理解&mut self的生命周期省略和相应的输出参数。

假设我有这个表格的函数签名

代码语言:javascript
复制
fn foo(&mut self) -> &mut bar

生词符号中的生存期部分。我了解到它被扩展到

代码语言:javascript
复制
fn foo<'a>(&'a mut self) -> &'a mut bar

它的副作用是,只要存在相应的对象,self就会不断地被借来。

我想知道的是,如果我指定一个有签名的函数,会发生什么?

代码语言:javascript
复制
fn foo<'a>(&mut self) -> &'a mut bar

据我理解,&mut self被省略,并且根据省略规则获得它自己的输入生命周期。所以我们最终的结果是

代码语言:javascript
复制
fn foo<'b, 'a>(&'b mut self) -> &'a mut bar

根据省略规则,'b被分配给所有被省略的输出生命周期。但是'a并没有被剥夺。那么,生命周期'a是什么?具有这样一个签名的代码编译得很好。但我不太明白'a一生的意义。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-30 22:36:46

你正确地没有对生命进行评估。

那么,生命周期'a是什么?

每当一个函数有一个生存期参数时,它总是:“调用者希望它是什么”(受边界约束,在本例中没有)。

具有这样一个签名的代码编译得很好。

你试过为这个功能写一个身体吗?考虑到这些生命,它实际上不能做很多事情。例如,

代码语言:javascript
复制
impl Foo {
    fn foo<'b, 'a>(&'b mut self) -> &'a mut Bar {
        &mut self.bar
    }
}

将无法编译错误告诉您(间接),这是有效的,只有当'b超过'a,但它没有。

如果将“超过”的关系添加到签名中,则代码可以编译:

代码语言:javascript
复制
impl Foo {
    fn foo<'b, 'a>(&'b mut self) -> &'a mut Bar
    where
        'b: 'a
    {
        &mut self.bar
    }
}

然而,这几乎没有比简单的更有用的了。

代码语言:javascript
复制
    fn foo<'a>(&'a mut self) -> &'a mut Bar {

因为引用通常可以被用作比它们的类型指定的生命周期更短的引用,所以这里的'a可以在更复杂的声明中服务于'a的目的和'b的目的。

票数 2
EN

Stack Overflow用户

发布于 2022-07-30 23:04:26

与任何其他泛型参数一样,只要'a满足该特征的任何泛型界限(在您的示例中没有任何通用边界),调用方就可以自由选择它。就像你有一种

代码语言:javascript
复制
// caller chooses the value of B in `fn collect<B>(self) -> B` to be Vec<_>
let items: Vec<_> = my_data.into_iter().collect();

你可以拥有

代码语言:javascript
复制
// 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的主体必须与此兼容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73179113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档