两个自变量具有相同的生命周期

问题描述 投票:0回答:1

考虑代码:

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
在这里有某种冲突呢?它们是完全不相关的变量,它们不互相借用等等。唯一的是它们具有相同的生命周期,但为什么这是一个问题呢?

rust lifetime borrow
1个回答
0
投票

我不是生命周期方面的专家,但我相信这是因为在第一次

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>) {}

xy都将被显示为错误被借用多次

© www.soinside.com 2019 - 2024. All rights reserved.