如何惯用地复制切片?

2024-04-24

在 Go 中,复制切片是标准操作,如下所示:

# It will figure out the details to match slice sizes
dst = copy(dst[n:], src[:m])

在 Rust 中,我找不到类似的替换方法。我想出的东西看起来像这样:

fn copy_slice(dst: &mut [u8], src: &[u8]) -> usize {
    let mut c = 0;
    for (&mut d, &s) in dst.iter_mut().zip(src.iter()) {
        d = s;
        c += 1;
    }
    c
}

不幸的是,我遇到了无法解决的编译错误:

error[E0384]: re-assignment of immutable variable `d`
 --> src/main.rs:4:9
  |
3 |     for (&mut d, &s) in dst.iter_mut().zip(src.iter()) {
  |               - first assignment to `d`
4 |         d = s;
  |         ^^^^^ re-assignment of immutable variable

我该如何设置d?有没有更好的方法来复制切片?


是的,使用方法clone_from_slice() https://doc.rust-lang.org/std/primitive.slice.html#method.clone_from_slice,它对于实现的任何元素类型都是通用的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]
}

目的地x是一个&mut [T]切片,或者任何取消引用的东西,比如可变的Vec<T>向量。您需要对目标和源进行切片,以便它们的长度匹配。


从 Rust 1.9 开始,您还可以使用copy_from_slice() https://doc.rust-lang.org/std/primitive.slice.html#method.copy_from_slice。其工作方式相同,但使用Copy特质而不是Clone,并且是直接包装memcpy。编译器可以优化clone_from_slice相当于copy_from_slice适用时,但它仍然有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何惯用地复制切片? 的相关文章

随机推荐