都沒有。有一個內置的操作這一點,Vec::append
:
移動所有進入Self
的其他元素,留下其他空。
fn move_values<T>(buffer: &mut Vec<T>, recipient: &mut Vec<T>) {
recipient.append(buffer);
}
無論你的函數甚至編譯:
fn move_values_1<T>(buffer: &mut Vec<T>, recipient: &mut Vec<T>) {
loop {
let value = buffer.pop();
if value.is_none() {
return;
}
recipient.push_front(card.unwrap());
}
}
error[E0425]: unresolved name `card`
--> src/main.rs:7:30
|
7 | recipient.push_front(card.unwrap());
| ^^^^ unresolved name
fn move_values_2<T>(buffer: &mut Vec<T>, recipient: &mut Vec<T>) {
for value in buffer.iter() {
recipient.push_front(value.clone());
}
buffer.clear();
}
error: no method named `push_front` found for type `&mut std::vec::Vec<T>` in the current scope
--> src/main.rs:7:19
|
7 | recipient.push_front(card.unwrap());
| ^^^^^^^^^^
如果我要實現它自己
嗯,有一個原因,它是爲你實現,但肯定...讓我們在挖。
檢查,如果事情is_some
或is_none
通常可以通過模式匹配避免。例如:
fn move_values_1<T>(buffer: &mut Vec<T>, recipient: &mut Vec<T>) {
while let Some(v) = buffer.pop() {
recipient.push(v);
}
}
當然,這種移動的一切在相反的順序因爲壓入和彈出的VEC既發生在末端。
調用clone
不會做你想要的,除非你的特質邊界說T
implements Clone
。否則,你只是克隆參考本身。
可避免對克隆的需求,如果你從一個收集漏值,並將其插入到其他:
for value in buffer.drain(..) {
recipient.push(value);
}
但是for
環是愚蠢的,只是extend
使用迭代的集合:
recipient.extend(buffer.drain(..));
我倒是仍然使用內置的append
方法相同類型的集合之間傳輸時,要做到這一點,因爲它可能是Ø針對精確的數據佈局進行了優化,並且可能專用於某些類型的數據。
將問題更改爲更接近真實問題 –
我將問題改回原來的樣子,您的答案仍然相關,只是在編輯答案時提醒您提前 –
@ElectricCoffee聽起來好。我相信你正在尋找的答案仍然在這個答案 - 最後一個代碼塊,具體來說。 – Shepmaster