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]占用不同的内存位置,所以一起使用它们并不危险。如果我遇到这个问题该怎么办?
v[0]
v[1]
您遇到的错误是由于 Rust 的借用规则造成的,该规则阻止您同时借用对同一数据的可变引用。在您的代码中,您尝试v两次可变地借用,一次是 for &mut v[0],一次是 for &mut v[1]。这违反了您不能同时对同一数据进行多次可变借用的规则。
v
&mut v[0]
&mut v[1]
即使v[0]和v[1]是向量中的不同元素,编译器也不能保证它们在内存中不会重叠。这是因为向量在内存中存储为连续数组,因此修改一个元素可能会影响相邻元素的内存布局。
要解决此问题,您可以创建对向量的两个单独的可变引用,然后将它们传递给函数change:
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函数。
split_at_mut(2)