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

impl<'a> Type<'a> {
    fn my_function(&self) -> &'a u32 {
        self.x
    }
}

Type<'a>个国家在本impl声明中指出,there is个国家将终生受益.返回类型-> &'a u32上的一个声明接收返回值的变量不应在...在什么之前?在Type型物体死亡之前?

这有什么区别:

impl TextEditor {
    //Other methods omitted ...

    pub fn get_text<'a>(&'a self) -> &'a String {
        return &self.text;
    }
}

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

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

推荐答案

'a在这两种情况下都是lifetime parameter.这是一种通用参数,所以每次使用Typeget_text都可以为该通用参数 Select 不同的"值".程序员永远不会明确 Select 实际的生命周期,除非使用'static.

编译器将为Type的每个值或get_text的每个使用推断'a应该是多少.

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

'a的确切含义取决于它在Type的定义中的用法.根据你的例子,我猜Type是这样的:

struct Type<'a> {
    x: &'a u32,
}

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

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

由于我们现在知道Type的 struct 定义,我们知道impl块中的'a参数始终等于Type的x字段中引用的生存期.

The one on the return type -> &'a u32 tells that the variable which is receiving the return value should not die before...before what? Before the object of type Type dies?

'a是存储在值Type<'a>中的引用的生存期,它与类型值本身没有其他关系.唯一的规则是'a必须比类型值本身更长寿,因为不允许它存储超过其生命周期 的引用.所以事实上,我们可以保持&'a u32,直到Type的值消失,甚至更长.


impl TextEditor {
    //Other methods omitted ...

    pub fn get_text<'a>(&'a self) -> &'a String {
        return &self.text;
    }
}

这很常见.&self是对self 价值的引用——borrow ——方法get_text也是一个通用项.它有一个通用参数——生存期参数.

它读取,对于任何生存期'a,borrow self作为引用&'a self(该生存期的引用),并返回对具有相同生存期的字符串的引用.

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

同样,方法get_text是泛型的,编译器将为方法的每次使用 Select 'a的"值".这是一种可以返回不同长度的字符串borrow 的方法,具体取决于允许它borrow 的时间.有时,它会 Select 一个较长的生命周期,这样你就可以长时间地坚持下go .如果不使用返回值,get_text的某些用法将使用更短的生存期.

在本例中,由于我们看到&'a String直接绑定到TextEditor值的借阅&'a self,我们知道,只要我们能保持TextEditor值的借阅,我们最多只能保持字符串引用.

Rust相关问答推荐

泛型属性比较

用 rust 蚀中的future 展望 struct 的future

如何计算迭代器适配器链中过滤的元素的数量

Rust函数的返回值不能引用局部变量或临时变量

为什么实现特征的对象期望比具体对象有更长的生命周期?

如何从宏调用闭包?

如何重命名 clap_derive 中的子命令占位符?

我们可以在 Rust 切片中使用步骤吗?

如何保存指向持有引用数据的指针?

Rust中是否可以在不复制的情况下从另一个不可变向量创建不可变向量?

缺失serde的字段无法设置为默认值

Rust:`sort_by` 多个条件,冗长的模式匹配

在 Rust 中使用 `SecTrustSettingsSetTrustSettings` 绑定导致 `errSecInternalComponent`

如何将 Rust 字符串转换为 i8(c_char) 数组?

产生拥有值的迭代器的 Rust 可变borrow 在循环中失败

为什么传递 option.as_ref 的行为不同于使用匹配块并将内部映射到 ref 自己?

为什么拥有 i32 所有权的函数需要它是可变的?

`map` 调用在这里有什么用吗?

Rust 跨同一文件夹中文件的可见性

提取 struct 生成宏中字段出现的索引