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

假设我有一个如下形式的函数签名

fn foo(&mut self) -> &mut bar

the lifetime section in the Rustonomicon开始,我了解到这一数字将扩展到

fn foo<'a>(&'a mut self) -> &'a mut bar

这有一个副作用,即只要相应的对象存在,self就会被可变地borrow .

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

fn foo<'a>(&mut self) -> &'a mut bar

在我的理解中,&mut self是省略的,并且根据省略规则获得它自己的输入生存期.所以我们最终会得到像这样的东西

fn foo<'b, 'a>(&'b mut self) -> &'a mut bar

根据省略规则,'b被分配给所有省略的输出生存期.但'a并没有被省略.那么生命中的'a是什么呢?具有这样的签名的代码编译得很好.但我不太理解'a的终生含义.

推荐答案

你正确地解开了生命的界限.

那么,'a岁的生命周期 是多少呢?

每当函数有一个生存期参数时,它总是:"调用者希望它是什么"(受限于界限,本例中没有界限).

具有这样的签名的代码编译得很好.

您是否try 过为该函数编写正文?考虑到这些人的生命周期 ,它实际上不能做太多事情.例如,

impl Foo {
    fn foo<'b, 'a>(&'b mut self) -> &'a mut Bar {
        &mut self.bar
    }
}

将无法编译,并(间接)告诉您这只在'b'a生命周期 长的情况下才有效,而实际上并非如此.

如果将"超期"关系添加到签名,则代码可以编译:

impl Foo {
    fn foo<'b, 'a>(&'b mut self) -> &'a mut Bar
    where
        'b: 'a
    {
        &mut self.bar
    }
}

然而,这几乎从来没有比更简单的更有用

    fn foo<'a>(&'a mut self) -> &'a mut Bar {

因为引用通常可以用于as if,所以它们的生存期比它们的类型指定的短,所以在更复杂的声明中,这里的'a可以用于'a的目的和'b的目的.

Rust相关问答推荐

在HashMap中插入Vacant条目的可变借位问题

关于Rust 中回归的逻辑

使用 struct 外部的属性来改变 struct 的原始方式

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

将serde_json读入`VEC<;T&>;`( rust 色)时出现问题

无法将 rust 蚀向量附加到另一个向量

为什么HashMap::get和HashMap::entry使用不同类型的密钥?

通过异常从同步代码中产生yield 是如何工作的?

Rust 中的复合 `HashSet` 操作或如何在 Rust 中获得 `HashSet` 的显式差异/并集

如何正确使用git2::Remote::push?

Rust 中指向自身的引用如何工作?

在Rust中实现Trie数据 struct 的更好方式

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

Rust 中的方法调用有什么区别?

在异步 Rust 中,Future 如何确保它只调用最近的 Waker?

Rust,使用枚举从 HashMap 获取值

匹配结果时的简洁日志(log)记录

Rust 中的通用 From 实现

有没有办法使用 NASM 语法进行内联汇编?

为什么这个 Trait 无效?以及改用什么签名?