为何clone_from_slice()在此Rust代码中执行失败?
为什么clone_from_slice触发panic而extend_from_slice可以正常运行
你的Rust代码如下:
pub fn new(src_objects: &[Arc<dyn Hitable>], time0: f32, time1: f32) -> Self { let object_span = src_objects.len(); let mut objects = Vec::with_capacity(object_span); objects.clone_from_slice(src_objects); ... }
核心原因
clone_from_slice的设计目的是用源切片的元素覆盖目标切片的已有元素,它强制要求目标切片的长度必须和源切片完全一致。而你用Vec::with_capacity(object_span)创建的Vec,只是预分配了能容纳object_span个元素的内存,Vec的实际长度是0,和src_objects的长度object_span不匹配,直接触发了长度检查的panic。
为什么extend_from_slice能正常运行
extend_from_slice的作用是把源切片的所有元素追加到Vec的末尾,它不要求目标Vec的初始长度和源切片一致——哪怕Vec初始是空的,只要内存足够(不够会自动扩容),就能把源元素全部添加进去,所以这里可以正常执行。
补充:如果想用clone_from_slice怎么改
如果一定要用clone_from_slice,你需要先把Vec的长度设置成和源切片一致,比如:
let mut objects = Vec::with_capacity(object_span); // 先填充足够数量的占位元素,再用clone_from_slice覆盖 objects.resize(object_span, Arc::new(/* 这里需要一个符合Hitable trait的默认实例 */)); objects.clone_from_slice(src_objects);
不过这种方式不如直接用src_objects.to_vec()或者extend_from_slice简洁。
内容的提问来源于stack exchange,提问作者Francisco José Letterio
相关产品推荐
相关产品推荐

