首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生命周期省略的第三条规则是否包含所有用于结构实现的情况?

生命周期省略的第三条规则是否包含所有用于结构实现的情况?
EN

Stack Overflow用户
提问于 2017-09-20 23:36:37
回答 1查看 308关注 0票数 8

人生的第三条法则是:

如果有多个输入生命周期参数,但其中一个是&self&mut self,因为这是一个方法,那么self的生存期被分配给所有输出生命周期参数。这使得写作方法更好。

下面是描述这个函数所发生的事情的教程

代码语言:javascript
复制
fn announce_and_return_part(&self, announcement: &str) -> &str

有两个输入生命周期,因此Rust应用了第一个生命周期省略规则,并给出了&selfannouncement各自的生命周期。然后,因为其中一个参数是&self,所以返回类型将获得&self的生存期,并且所有的生命周期都已计算在内。

我们可以表明,所有的生命周期都没有计算在内,因为announcement的生命周期可能与&self不同。

代码语言:javascript
复制
struct ImportantExcerpt<'a> {
    part: &'a str,
}

impl<'a> ImportantExcerpt<'a> {
    fn announce_and_return_part(&self, announcement: &str) -> &str {
        println!("Attention please: {}", announcement);
        announcement
    }
}

fn main() {
    let i = ImportantExcerpt { part: "IAOJSDI" };
    let test_string_lifetime;

    {
        let a = String::from("xyz");
        test_string_lifetime = i.announce_and_return_part(a.as_str());
    }
    println!("{:?}", test_string_lifetime);   
}

announcement的生存期不像&self那么长,所以将输出生存期与&self相关联是不正确的,难道不应该将输出生存期与输入的长度关联起来吗?

为什么生命周期省略的第三条规则是分配输出生存期的有效方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-20 23:41:37

不,省略规则并不能涵盖每一种可能的情况。如果是这样,那么就不会有任何省略规则,它们将是唯一的规则,并且我们不需要任何语法来指定显式的生存期。

引用你所链接的文件,强调我的:

在Rust对参考文献的分析中编程的模式称为生命周期省略规则。这些规则不是程序员需要遵循的规则;这些规则是编译器将考虑的一组特殊情况,如果您的代码适合这些情况,则不需要显式地编写生命周期。 省略规则没有提供充分的推断:如果Rust决定性地应用了这些规则,但是对于引用的生存期仍然不明确,它不会猜测剩下的引用的生存期应该是。在这种情况下,编译器将提供一个错误,可以通过添加与您的意图相对应的生存期注释来解决该错误。

announcement的生存期不如&self长,因此将输出生存期与&self相关联是不正确的。 为什么生命周期省略的第三条规则是分配输出生存期的有效方法?

“正确”可能不是这里使用的正确词。省略规则所做的是是一种有效的方式,它并不是您想要的。

不应该将输出生存期与输入的长度关联起来吗?

是的,对于这个例子来说,这是可以接受的,只是这不是最常见的情况,所以这不是省略规则的目的。

另请参阅:

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

https://stackoverflow.com/questions/46333242

复制
相关文章

相似问题

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