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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:03:36