struct A<'a> {
    v: &'a str,
}

impl<'a> A<'a> {
    pub fn test(&'a mut self) {
        self.trivial();

        // Compiling error info:
        //       cannot borrow `*self` as mutable more than once at a time
        // first mutable borrow occurs here (last called self.trivial())
        self.trivial(); // Compiling error line.
    }

    // Trivial empty function.
    fn trivial(&'a mut self) {}
}

编译错误发生在第二个调用self.trivial()时,编译器提示这是第一个调用self.trivial可变borrow *self.如果平凡函数是通过go 掉生命周期 ‘a来定义的,那么一切都很好.

// ok then if no 'a specified.
fn trivial(&mut self) {}

我的问题是,为什么生命周期 'a会影响借款?我认为函数trivial有一个类型为&mut的参数,它只接受实参,根本不接受借阅,第一个调用如何借阅?

推荐答案

生命中的第name条很重要.当您给它'a作为显式生存期时,您就是说赋予trivial&mut self引用在 struct 本身的生存期内必须保持可访问.这意味着在第一次拨打trivial之后,它不会被"释放".如果您将其更改为trivialits own个生命周期 :

fn trivial<'b>(&'b mut self) {}

现在它可以很好地工作了,因为借入只持续到函数调用的时间.如果您完全删除生命周期注释,这与implicitly发生的事情是一样的.

请注意,将&mut self(或任何引用)传递到函数is a borrow中--当该参数是引用时,"接受参数而根本不borrow "实际上没有意义.

Rust相关问答推荐

为什么父作用域中的变量超出了子作用域

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

在Rust中宏的表达式中提取对象

支持TLS的模拟HTTP服务器

铁 rust 中的共享对象实现特征

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

不同类型泛型的映射

当我编译 Rust 代码时,我是否缺少 AVX512 的目标功能?

Rust 文件未编译到 dll 中

Rust:为什么 Pin 必须持有指针?

如何获取模块树?

如何为整数切片定义一个带有额外函数的特性别名?

有什么办法可以追踪泛型的单态化过程吗?

第 7.4 章片段中如何定义 `thread_rng`

在 RefCell 上borrow

在 Rust 中返回对枚举变体的引用是个好主意吗?

使用 `.` 将 T 转换为 &mut T?

Rust 中的通用 From 实现

为什么这个闭包没有比 var 长寿?

在 Rust 中获得准确时间的正确方法?