小能豆

如何同时获取两个数组元素的可变引用?

rust

fn change(a: &mut i32, b: &mut i32) {
    let c = *a;
    *a = *b;
    *b = c;
}

fn main() {
    let mut v = vec![1, 2, 3];
    change(&mut v[0], &mut v[1]);
}

当我编译上面的代码时,出现错误:

error[E0499]: cannot borrow `v` as mutable more than once at a time
 --> src/main.rs:9:32
  |
9 |         change(&mut v[0], &mut v[1]);
  |                     -          ^   - first borrow ends here
  |                     |          |
  |                     |          second mutable borrow occurs here
  |                     first mutable borrow occurs here

为什么编译器会禁止它?v[0]并且v[1]占用不同的内存位置,所以一起使用它们并不危险。如果我遇到这个问题该怎么办?


阅读 72

收藏
2024-05-21

共1个答案

小能豆

您遇到的错误是由于 Rust 的借用规则造成的,该规则阻止您同时借用对同一数据的可变引用。在您的代码中,您尝试v两次可变地借用,一次是 for &mut v[0],一次是 for &mut v[1]。这违反了您不能同时对同一数据进行多次可变借用的规则。

即使v[0]v[1]是向量中的不同元素,编译器也不能保证它们在内存中不会重叠。这是因为向量在内存中存储为连续数组,因此修改一个元素可能会影响相邻元素的内存布局。

要解决此问题,您可以创建对向量的两个单独的可变引用,然后将它们传递给函数change

锈复制代码fn change(a: &mut i32, b: &mut i32) {
    let c = *a;
    *a = *b;
    *b = c;
}

fn main() {
    let mut v = vec![1, 2, 3];

    // Create mutable references to the vector elements
    let (first, second) = v.split_at_mut(2);
    let first = &mut first[0];
    let second = &mut second[0];

    // Call the change function with the mutable references
    change(first, second);
}

在此代码中,split_at_mut(2)用于将向量拆分为索引 2 处的两个可变切片。然后,从每个切片中获取对第一个和第二个元素的单独可变引用。最后,这些可变引用被传递给change函数。

2024-05-21