You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中如何用较小slice修改更大的slice或Vec的部分内容

Rust 使用小切片修改大切片/数组/Vec 部分内容的实现方法

你示例中的直接赋值写法会编译报错,因为 Rust 中固定长度数组和动态切片属于不同类型,bigger[0..3] 是动态长度的&mut [u8]切片类型,smaller是[u8;3]固定长度数组类型,二者不支持直接赋值。可以通过以下几种方式实现需求:

  • 方案1:copy_from_slice(最常用,适用于实现了Copy trait 的类型)
    这是针对可复制类型最简单的实现方式,只需对目标切片调用该方法传入源切片引用即可:

    let mut bigger: [u8; 100] = [0u8; 100];
    let smaller: [u8; 3] = [1, 2, 3];
    
    bigger[0..3].copy_from_slice(&smaller);
    

    注意:该方法要求源切片和目标切片长度完全一致,长度不匹配时会触发运行时panic。

  • 方案2:安全无panic版本
    如果无法保证长度完全匹配,可以先做合法性检查再赋值,避免panic:

    let mut bigger: [u8; 100] = [0u8; 100];
    let smaller: [u8; 3] = [1, 2, 3];
    
    if let Some(target_slice) = bigger.get_mut(0..smaller.len()) {
        target_slice.copy_from_slice(&smaller);
    }
    
  • 方案3:clone_from_slice(适用于实现了Clone trait 但未实现Copy的类型)
    如果你操作的元素是字符串、自定义结构体等不支持复制的类型,可以用该方法替代:

    let mut bigger: Vec<String> = vec!["".to_string(); 100];
    let smaller: [String; 3] = ["a".to_string(), "b".to_string(), "c".to_string()];
    
    bigger[0..3].clone_from_slice(&smaller);
    
  • 方案4:遍历自定义赋值
    需要额外处理赋值逻辑时,可以通过迭代器遍历逐个赋值:

    bigger[0..3].iter_mut()
        .zip(smaller.iter())
        .for_each(|(dest, src)| *dest = *src);
    

以上所有方法对Vec同样适用,只需对Vec截取对应区间的可变切片调用对应方法即可。

内容的提问来源于stack exchange,提问作者Visual Eugen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:12:00