I was doing something like this:
type HashId = [u8; 32];
fn fill_hash_id(hash_id: &mut HashId, hash_data: &[u8]) {
for i in 0..32 {
hash_id[i] = hash_data[i];
}
()
}
Is there a better, more direct or idiomatic way for this in Rust?
CodePudding user response:
To expand a comment on your question into a full answer:
The slice method copy_from_slice will work.
Because an an array [T; N] implements AsMut<[T]>* (that is, a reference to a mutable array of T can be treated as a mutable slice of T), you can call this method on an array.
type HashId = [u8; 32];
fn main() {
let mut hash_id: HashId = [0u8; 32];
let hash_data = vec![1u8; 32];
hash_id.copy_from_slice(&hash_data);
println!("{:?}", &hash_id);
// bunch of '1's
}
But be careful; copy_from_slice will panic if the target and receiver aren't the same length.
*Full disclosure: [T; N] also implements BorrowMut<T>, and while I'm pretty sure AsMut is the trait that's in play here, I'm not 100% sure it's not BorrowMut.
