impl上的第一个显式生命周期说明符是什么意思?

xet*_*a11 9 lifetime rust

impl上有三种不同的生命周期说明符:

impl<'a> Type<'a> {
    fn my_function(&self) -> &'a u32 {
        self.x
    }
}
Run Code Online (Sandbox Code Playgroud)

Type<'a>这个IMPL声明一生.返回类型-> &'a u32中的那个表明接收返回值的变量不应该在......之前死掉?在类型的对象Type死之前?

有什么不同:

impl TextEditor {
    //Other methods omitted ...

    pub fn get_text<'a>(&'a self) -> &'a String {
        return &self.text;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里它表示返回类型在&'a self结束的生命周期之前不会死亡.

最后一个是否只声明了这个方法的生命周期,而另一个方法声明了impl声明中每个方法(和关联函数?)的生命周期?

blu*_*uss 13

'a在两种情况下都是生命周期参数.这是一种通用参数,因此每次使用Type或每次使用都get_text可以为该通用参数选择不同的"值".除非您使用,否则程序员不会明确选择实际生命周期'static.

编译器将推断'a每个值Type或每次使用的值应该是什么get_text.

impl<'a>为整个impl块引入了一个新的生命周期参数.然后在类型中使用:impl<'a> Type<'a> { .. }

究竟是什么'a意思取决于它在定义中的使用方式Type.从你的例子中,我猜Type是这样的:

struct Type<'a> {
    x: &'a u32,
}
Run Code Online (Sandbox Code Playgroud)

该定义如下:对于每个生命周期'a,定义Type以包含引用x: &'a u32.因此Type是通用的,可以存储任何生命周期的引用.

impl<'a> Type<'a> { .. }读取:对于每个生命周期'a,定义类型的方法Type<'a>.

由于我们现在知道结构定义Type,我们知道'aimpl块内的参数总是等于Type'sx字段中引用的生命周期.

返回类型中的一个 - >&'a u32告诉接收返回值的变量不应该在......之前死掉?Type类型的对象死之前?

'a存储在值内的引用的生命周期Type<'a>,它与Type值本身没有其他关系.唯一的规则是'a必须比Type值本身更长,因为不允许在其生命周期结束时存储引用.所以事实上,我们可以坚持到最后,&'a u32直到Type价值消亡,甚至可能更长.


impl TextEditor {
    //Other methods omitted ...

    pub fn get_text<'a>(&'a self) -> &'a String {
        return &self.text;
    }
}
Run Code Online (Sandbox Code Playgroud)

这很常见.&self是对自我价值的引用 - 借用 - 而且该方法get_text也是一个通用项目.它有一个通用参数 - 一个生命周期参数.

它读取,在任何生命周期中'a,借用self作为引用&'a self(该生命周期的引用)并返回对具有相同生命周期的String的引用.

在输入&self和输出上使用相同的参数&String意味着它们是连接的,只要返回的String引用是活动的,Rust就会将self视为借用.

同样,该方法get_text是通用的,编译器将为'a每次使用该方法选择一个"值" .这是一种方法,可以返回String的各种长期借用,具体取决于您允许借用的时间长度self.有时它会选择很长的使用寿命,因此您可以长时间保持返回&String状态.get_text如果您根本不使用返回值,则某些用途将使用较短的生命周期.

在这种情况下,由于我们看到它&'a String直接与值的借用相关&'a selfTextEditor,我们知道只要我们可以借用该值,我们只能保留String引用TextEditor.

  • 我认为这应该是它自己的博客文章……哇。 (2认同)

Chr*_*son 9

解释Rust代码:

impl<'a>
Run Code Online (Sandbox Code Playgroud)

"如果你给我一辈子......"(编译器通常在使用类型时根据上下文提供)

         Type<'a> {
Run Code Online (Sandbox Code Playgroud)

"......我将描述如何实施Type<'a>".所以Type可能包含引用(需要一生).

    fn my_function(&self) -> &'a u32 {
Run Code Online (Sandbox Code Playgroud)

"......并且给出了一个参考Type<'a>,你打电话my_function()来获得一个u32有生命周期的参考'a." 请注意,&self引用的生命周期并不直接关联'a; 它可以更短(但通常不长于'a,因为类型不能超过包含的引用).

在第二种情况:

impl TextEditor {
Run Code Online (Sandbox Code Playgroud)

"这是如何实现非寿命参数类型TextEditor......"

pub fn get_text<'a>
Run Code Online (Sandbox Code Playgroud)

"给定一个'a你可以选择的生命周期(它是一个输入参数)......"

                   (&'a self)
Run Code Online (Sandbox Code Playgroud)

"......并提到TextEditor至少生活在'a......"

                             -> &'a String {
Run Code Online (Sandbox Code Playgroud)

"......你可以打电话给这个get_text方法并获得一个借用的参考文献,这个参考文献String同时存在."

从更实际的角度来说,这实际上意味着String直接重新借用TextEditor- 只要该String引用存活,&self借用被认为仍然是活跃的,您将无法接受任何&mut引用.

  • 谢谢,这非常有帮助!我发现我孤立地理解 Rust 的大部分概念,但在实践中将它们放在一起时经常会遇到困难。将简洁的语法翻译成解释性的散文是理解正在发生的事情的好方法。我希望阅读代码示例更重要:) (5认同)