【发布时间】:2015-12-15 08:26:10
【问题描述】:
我正在尝试初始化 None 值的盒装切片,以便基础类型 T 不需要实现 Clone 或 Copy。这里有几个理想的解决方案:
fn by_vec<T>() -> Box<[Option<T>]> {
vec![None; 5].into_boxed_slice()
}
fn by_arr<T>() -> Box<[Option<T>]> {
Box::new([None; 5])
}
不幸的是,by_vec 实现需要T: Clone,而by_arr 实现需要T: Copy。我尝试了更多方法:
fn by_vec2<T>() -> Box<[Option<T>]> {
let v = &mut Vec::with_capacity(5);
for i in 0..v.len() {
v[i] = None;
}
v.into_boxed_slice() // Doesn't work: cannot move out of borrowed content
}
fn by_iter<T>() -> Box<[Option<T>]> {
(0..5).map(|_| None).collect::<Vec<Option<T>>>().into_boxed_slice()
}
by_vec2 没有通过编译器(我不确定我理解为什么),但by_iter 可以。我担心collect 的性能——它是否需要在迭代时调整它正在收集的向量的大小,或者它是否可以分配正确大小的向量?
也许我做错了——我对 Rust 很陌生,所以任何提示都将不胜感激!
【问题讨论】:
标签: rust