我試圖初始化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很新,所以任何提示將不勝感激!
我認爲這裏最重要的是* Range迭代器[...]知道它恰好是5個元素*。這就是我編寫這段代碼的方法,雖然我會在'collect'類型參數上使用類型推斷:'(0..5).map(| _ | None).collect ::>()。into_boxed_slice( )'。 –
Shepmaster