スライスへの可変借用の分割には専用のメソッドが必要になる。
スライスの各要素は構造体の各フィールドと異なり、そのままでは別々に排他参照を得る事ができない。これは要素のインデックスが動的になるパターンにおいて、重複を検出する手段がないためである。
fn main() {
let mut obj = MyStruct {a: 0, b: 0};
let a = &mut obj.a;
let b = &mut obj.b;
*a += 1;
*b += 1;
assert_eq!(obj.a, obj.b);
}
struct MyStruct {
a: i32,
b: i32,
}
fn main() {
let mut obj = [0, 0];
let a = &mut obj[0];
let b = &mut obj[1];
*a += 1;
*b += 1;
assert_eq!(obj[0], obj[1]);
}
error[E0499]: cannot borrow `obj[_]` as mutable more than once at a time --> src\main.rs:4:13 | 3 | let a = &mut obj[0]; | ----------- first mutable borrow occurs here 4 | let b = &mut obj[1]; | ^^^^^^^^^^^ second mutable borrow occurs here 5 | *a += 1; | ------- first borrow later used here | = help: use `.split_at_mut(position)` to obtain two mutable non-overlapping sub-slices
スライスを重複なく分割できれば、複数の排他参照を提供できる。
以下はそうした分割を保証したメソッドの抜粋である。
slice::split_at_mut
slice::split_at_mut_checked
slice::split_at_mut_unchecked
slice::split_first_mut
slice::split_last_mut
slice::iter_mut
slice::split_mut
slice::get_disjoint_mut
str::split_at_mut
str::split_at_mut_checked
fn main() {
let mut obj = [0, 0];
let (a, b) = obj.split_at_mut(1);
a[0] += 1;
b[0] += 1;
assert_eq!(obj[0], obj[1]);
}