#array #borrow #index

arref

Make borrow mut elements from an array easier

1 unstable release

0.1.0 Sep 26, 2022

#57 in #borrow

Download history 226/week @ 2024-08-30 332/week @ 2024-09-06 214/week @ 2024-09-13 175/week @ 2024-09-20 146/week @ 2024-09-27 40/week @ 2024-10-04 167/week @ 2024-10-11 99/week @ 2024-10-18 86/week @ 2024-10-25 126/week @ 2024-11-01 91/week @ 2024-11-08 196/week @ 2024-11-15 105/week @ 2024-11-22 101/week @ 2024-11-29 128/week @ 2024-12-06 58/week @ 2024-12-13

461 downloads per month
Used in 8 crates (5 directly)

MIT license

6KB
50 lines

Getting mutable references to two elements from the same array is hard. This tiny lib provides method to make it easier.

[array_mut_ref!] checks whether the user borrows the same element at runtime.

use arref::array_mut_ref;
let mut arr = vec![1, 2, 3, 4];
let (a, b) = array_mut_ref!(&mut arr, [1, 2]);
assert_eq!(*a, 2);
assert_eq!(*b, 3);
let (a, b, c) = array_mut_ref!(&mut arr, [1, 2, 0]);
assert_eq!(*c, 1);

// ⚠️ The following code will panic. Because we borrow the same element twice.
// let (a, b) = array_mut_ref!(&mut arr, [1, 1]);

Alternatively, you can use [mut_twice]. It won't panic if you borrow the same element twice. It'll return an Err(&mut T) instead.

use arref::mut_twice;
let mut arr = vec![1, 2, 3];
let (a, b) = mut_twice(&mut arr, 1, 2).unwrap();
assert_eq!(*a, 2);
assert_eq!(*b, 3);
let result = mut_twice(&mut arr, 1, 1);
assert!(result.is_err());
if let Err(v) = result {
    assert_eq!(*v, 2);
}

lib.rs:

Getting mutable references to two elements from the same array is hard. This tiny lib provides method to make it easier.

[array_mut_ref!] checks whether the user borrows the same element at runtime.

use arref::array_mut_ref;
let mut arr = vec![1, 2, 3, 4];
let (a, b) = array_mut_ref!(&mut arr, [1, 2]);
assert_eq!(*a, 2);
assert_eq!(*b, 3);
let (a, b, c) = array_mut_ref!(&mut arr, [1, 2, 0]);
assert_eq!(*c, 1);

// ⚠️ The following code will panic. Because we borrow the same element twice.
// let (a, b) = array_mut_ref!(&mut arr, [1, 1]);

Alternatively, you can use [mut_twice]. It won't panic if you borrow the same element twice. It'll return an Err(&mut T) instead.

use arref::mut_twice;
let mut arr = vec![1, 2, 3];
let (a, b) = mut_twice(&mut arr, 1, 2).unwrap();
assert_eq!(*a, 2);
assert_eq!(*b, 3);
let result = mut_twice(&mut arr, 1, 1);
assert!(result.is_err());
if let Err(v) = result {
    assert_eq!(*v, 2);
}

No runtime deps