生命周期省略的第三条规则是否涵盖了结构实现的所有情况?

Jal*_*Jal 6 lifetime rust

终身省略的第三条规则说

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

这是描述此功能发生了什么的教程

fn announce_and_return_part(&self, announcement: &str) -> &str
Run Code Online (Sandbox Code Playgroud)

有两个输入生命周期,所以 Rust 应用第一个生命周期省略规则并给出它们&selfannouncement它们自己的生命周期。然后,因为其中一个参数是&self,返回类型获得 的生命周期&self,并且所有生命周期都已被考虑在内。

我们可以证明所有生命周期都没有考虑在内,因为它的生命周期可能与announcement不同&self

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);   
}
Run Code Online (Sandbox Code Playgroud)

的寿命announcement不长&self,因此将输出生命周期与 关联是不正确的,输出生命周期&self不应该与输入的较长者相关联吗?

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

She*_*ter 6

不,省略规则不能捕获生命周期中的所有可能情况。如果他们这样做了,那么就不会有任何省略规则,它们将是唯一的规则,我们不需要任何语法来指定明确的生命周期。

引用您链接到的文档,强调我的:

编程到 Rust 的引用分析中的模式称为生命周期省略规则。这些不是程序员应该遵循的规则;规则是编译器会考虑的一组特定情况,如果您的代码适合这些情况,则无需明确编写生命周期

省略规则不提供完整的推理:如果 Rust 确定性地应用规则,但仍然不明确引用的生命周期,它不会猜测剩余引用的生命周期应该是什么。在这种情况下,编译器会给你一个错误,可以通过添加生命周期注解来解决这个错误,这些注解与你的意图如何引用相互关联。


的生命周期announcement不长&self,因此将输出生命周期与&self

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

“正确”可能不是在这里使用的正确词。什么是省音规则所做的是一个有效的方式,只是碰巧不是您可能想要的。

输出寿命不应该与输入的较长时间相关联吗?

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

也可以看看:


归档时间:

查看次数:

202 次

最近记录:

8 年,3 月 前