Свежий Rust Tip по свежему stable API
С версии 1.86 в stable стал доступен метод
slice::get_disjoint_mut.
Который позволяет получить мутабельные ссылки на разные элементы слайса одновременно.
Разность проверяется методом и при пересечении возвращается ошибка.
Равно как и при индексе вне диапазона.
Вот как его можно использовать
let mut array = [10, 20, 30, 40, 50];
let [a, b, c] = array.get_disjoint_mut([1, 3, 4]).expect("Index overlap");
*a += 100; // 20 -> 120
*b += 100; // 40 -> 140
*c += 100; // 50 -> 150
Так же как
get, можно использовать
Range,
RangeInclusive,
RangeFrom,
RangeTo и
RangeFull, хотя все кроме первых двух для этого метода вряд ли пригодятся.
Так как в метод передается массив, то все должны быть одного типа.
let [a, b, c] = array.get_disjoint_mut([0..2, 2..3, 3..5]).expect("Range overlap");
a.copy_from_slice(&[9, 10]);
b.copy_from_slice(&[11]);
c.copy_from_slice(&[12, 13]);
Похожим методом обзавелся и
HashMap, но там вместо возвращения ошибки метод паникует, и возвращает массив
Option.
let mut map = HashMap::from([
("a", 1),
("b", 2),
("c", 3),
]);
let [oa, ob] = map.get_disjoint_mut(["a", "b"]);
if let (Some(a), Some(b)) = (oa, ob) {
*a += 10;
*b += 20;
}
Для любителей unsafe есть версии
*_unchecked этих методов, которые пропускают проверку непересечения индекстов/диапазонов/ключей.
Удачного вам мулти-индексирования.