在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(),它对实现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().这是一个memcpy的直接包装器,但使用Copy特征而不是Clone.如果适用,编译器可以将clone_from_slice优化为相当于copy_from_slice,但它仍然有用.

Rust相关问答推荐

为什么迭代器上的`. map(...)`的返回类型如此复杂?

从特征实现调用函数的Rust惯用方法

如何删除Mac Tauri上的停靠图标?

用于判断整数块是否连续的SIMD算法.

不能在Rust中使用OpenGL绘制三角形

无法将 rust 蚀向量附加到另一个向量

为什么Option类型try块需要类型注释?

Rust将String上的迭代器转换为&;[&;str]

为什么AsyncRead在Box上的实现有一个Unpin特征绑定?

tokio::sync::broadcast::Receiver 不是克隆

Rust 中的复合 `HashSet` 操作或如何在 Rust 中获得 `HashSet` 的显式差异/并集

可选包装枚举的反序列化

根据掩码将 simd 通道设置为 0 的惯用方法?

如何正确使用git2::Remote::push?

我可以禁用发布模式的开发依赖功能吗?

如何获取模块树?

切片不能被 `usize` 索引?

为什么 match 语句对引用类型比函数参数更挑剔?

在 Rust 中退出进程

在 Rust 中组合特征的不同方法是否等效?