考虑代码:
struct Y<'a>(&'a i32);
fn foo<'a>(x: &'a mut i32, y: &mut Y<'a>) {
bar(x, y);
// error[E0499]: cannot borrow `*x` as mutable more than once at a time
bar(x, y);
}
fn bar<'a>(x: &'a mut i32, y: &mut Y<'a>) {}
第二次调用
bar(x, y)
会出现错误:
error[E0499]: cannot borrow `*x` as mutable more than once at a time
--> src/main.rs:7:9
|
5 | fn foo<'a>(x: &'a mut i32, y: &mut Y<'a>) {
| -- lifetime `'a` defined here
6 | bar(x, y);
| ---------
| | |
| | first mutable borrow occurs here
| argument requires that `*x` is borrowed for `'a`
7 | bar(x, y);
| ^ second mutable borrow occurs here
我不明白这个错误,因为它没有说任何关于
y
的字,但是问题在某种程度上与y
有关,因为如果我删除y
,就不会出现错误。但为什么x
和y
在这里有某种冲突呢?它们是完全不相关的变量,它们不互相借用等等。唯一的是它们具有相同的生命周期,但为什么这是一个问题呢?
我不是生命周期方面的专家,但我相信这是因为在第一次
bar()
调用时,通过将 bar
的生命周期定义为
fn bar<'a>(x: &'a mut i32, y: &mut Y<'a>) {}
你是说bar()
对
x的mut借用与y一样长(它本身的价值,而不是参考)。
所以当你第二次调用
bar()
时,因为y仍然存在,x的第一个mut借用也没有被删除,所以x不能被第二次mut借用。
请注意,您没有定义 y 的 mut 引用实际存在多长时间。如果您这样做:
fn foo<'a>(x: &'a mut i32, y: &'a mut Y<'a>) {
bar(x, y);
bar(x, y);
}
fn bar<'a>(x: &'a mut i32, y: &'a mut Y<'a>) {}
x和y都将被显示为错误被借用多次