How to idiomatically copy a slice?
Yes, use the method clone_from_slice()
, it is generic over any element type that implements Clone
.
fn main() {
let mut x = vec![0; 8];
let y = [1, 2, 3];
x[..3].clone_from_slice(&y);
println!("{:?}", x);
// Output:
// [1, 2, 3, 0, 0, 0, 0, 0]
}
The destination x
is either a &mut [T]
slice, or anything that derefs to that, like a mutable Vec<T>
vector. You need to slice the destination and source so that their lengths match.
As of Rust 1.9, you can also use copy_from_slice()
. This works the same way but uses the Copy
trait instead of Clone
, and is a direct wrapper of memcpy
. The compiler can optimize clone_from_slice
to be equivalent to copy_from_slice
when applicable, but it can still be useful.
This code works, even though I am not sure if it the best way to do it.
fn copy_slice(dst: &mut [u8], src: &[u8]) -> usize {
let mut c = 0;
for (d, s) in dst.iter_mut().zip(src.iter()) {
*d = *s;
c += 1;
}
c
}
Apparently not specifying access permissions explicitly did the trick. However, I am still confused about this and my mental model doesn't yet cover what's truly going on there. My solutions are mostly trial and error when it comes to these things, and I'd rather like to truly understand instead.