如何理解具有相同生命周期的不可变借用的可变借用?
How to understand a mutable borrow of an immutable borrow with the same lifetimes?
我很难理解这段代码:
fn main() {}
fn f<'a>(mem: &'a mut &'a u8) {}
fn dp<'a>(mem: &'a mut &'a u8) {
f(mem);
f(mem);
}
错误消息说:
error[E0499]: cannot borrow `*mem` as mutable more than once at a time
--> src/main.rs:7:7
|
5 | fn dp<'a>(mem: &'a mut &'a u8) {
| -- lifetime `'a` defined here
6 | f(mem);
| ------
| | |
| | first mutable borrow occurs here
| argument requires that `*mem` is borrowed for `'a`
7 | f(mem);
| ^^^ second mutable borrow occurs here
我知道&'a mut &'a u8
这件事不对,但为什么错误信息是这样的?
&mut T
在 T
上是不变的。在这里,您的 T
是 &u8
。问题是内在和外在的生命周期是一样的。内部生命周期 'a
是“某个”生命周期,大于(或至少等同于)函数的持续时间 dp()
,但由于它位于可变引用之后,因此无法缩短到函数的持续时间函数 f()
(记住 &mut T
在 T
上是不变的)。但是可变引用(外部)也是 'a
,因此 *mem
将在首先调用 f()
。因此第二次调用失败,因为 *mem
已经被借用了。您可以通过使用不同的(即不相交的)内部和外部生命周期来解决此问题。
您可以阅读有关方差和生命周期的更多信息here。
我很难理解这段代码:
fn main() {}
fn f<'a>(mem: &'a mut &'a u8) {}
fn dp<'a>(mem: &'a mut &'a u8) {
f(mem);
f(mem);
}
错误消息说:
error[E0499]: cannot borrow `*mem` as mutable more than once at a time
--> src/main.rs:7:7
|
5 | fn dp<'a>(mem: &'a mut &'a u8) {
| -- lifetime `'a` defined here
6 | f(mem);
| ------
| | |
| | first mutable borrow occurs here
| argument requires that `*mem` is borrowed for `'a`
7 | f(mem);
| ^^^ second mutable borrow occurs here
我知道&'a mut &'a u8
这件事不对,但为什么错误信息是这样的?
&mut T
在 T
上是不变的。在这里,您的 T
是 &u8
。问题是内在和外在的生命周期是一样的。内部生命周期 'a
是“某个”生命周期,大于(或至少等同于)函数的持续时间 dp()
,但由于它位于可变引用之后,因此无法缩短到函数的持续时间函数 f()
(记住 &mut T
在 T
上是不变的)。但是可变引用(外部)也是 'a
,因此 *mem
将在首先调用 f()
。因此第二次调用失败,因为 *mem
已经被借用了。您可以通过使用不同的(即不相交的)内部和外部生命周期来解决此问题。
您可以阅读有关方差和生命周期的更多信息here。