T未实现Clone时,如何用vec!宏创建全为None的Option<T>向量?
解决方案:创建填充
None的Vec<Option<T>>(无需T: Clone) 你遇到的问题是vec![None; capacity]要求Option<T>实现Clone,而这依赖于T: Clone——但其实我们根本不需要克隆T,因为None变体完全不涉及T的实例。下面是几种简洁的替代写法:
方法1:使用迭代器生成(推荐)
利用std::iter::repeat生成重复的None,再通过take限制数量并收集到Vec中:
let foo: Vec<Option<T>> = std::iter::repeat(None).take(capacity).collect();
这个写法一行搞定,且不需要T实现任何额外 trait。因为None作为Option<T>的变体,复制它不需要涉及T的任何操作,完全零成本。同时,由于take(capacity)提供了准确的大小提示,collect会直接预分配对应容量的内存,和你原来的代码效率一致。
方法2:使用resize_with
如果你倾向于先预分配空间再填充,可以用Vec::resize_with:
let mut foo: Vec<Option<T>> = Vec::with_capacity(capacity); foo.resize_with(capacity, || None);
这个方法会在已预分配的空间中直接填充None,同样不需要T实现Clone。
为什么vec!宏不行?
vec![x; n]的底层逻辑是先克隆一次x,然后重复复制这个克隆出的实例(对于Copy类型是直接复制,否则调用clone)。但编译器会检查整个Option<T>是否满足Clone约束,而Option<T>: Clone的前提是T: Clone——哪怕我们用的是None,这个约束依然存在,所以无法直接使用这个宏。
内容的提问来源于stack exchange,提问作者guenhter
相关产品推荐
相关产品推荐

