Rust中如何用较小slice修改更大的slice或Vec的部分内容
Rust 使用小切片修改大切片/数组/Vec 部分内容的实现方法
你示例中的直接赋值写法会编译报错,因为 Rust 中固定长度数组和动态切片属于不同类型,bigger[0..3] 是动态长度的&mut [u8]切片类型,smaller是[u8;3]固定长度数组类型,二者不支持直接赋值。可以通过以下几种方式实现需求:
方案1:
copy_from_slice(最常用,适用于实现了Copytrait 的类型)
这是针对可复制类型最简单的实现方式,只需对目标切片调用该方法传入源切片引用即可: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(适用于实现了Clonetrait 但未实现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
相关产品推荐
相关产品推荐

