tgoop.com/random_rust_dev/203
Create:
Last Update:
Last Update:
Свежий 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
этих методов, которые пропускают проверку непересечения индекстов/диапазонов/ключей.Удачного вам мулти-индексирования.
BY Random Rust Dev
Share with your friend now:
tgoop.com/random_rust_dev/203