Vector 我如何获得Vec元素的所有权并用其他元素替换它?

Vector 我如何获得Vec元素的所有权并用其他元素替换它?,vector,rust,lifetime,ownership,Vector,Rust,Lifetime,Ownership,我正在编写以下格式的函数: fn pop<T>(data: &mut Vec<Option<T>>) -> Option<T> { // Let the item be the current element at head let item = data[0]; // and "remove" it. data[0] = None; item } fn-pop(数据:&mut-Vec)-

我正在编写以下格式的函数:

fn pop<T>(data: &mut Vec<Option<T>>) -> Option<T> {
    // Let the item be the current element at head
    let item = data[0];

    // and "remove" it.
    data[0] = None;

    item
}
fn-pop(数据:&mut-Vec)->选项{
//将项目设为头部的当前元素
设项=数据[0];
//并“移除”它。
数据[0]=无;
项目
}
当我尝试这样做时,我会得到一个有意义的错误:

错误[E0507]:无法移出'std::vec::vec'的索引`
-->src/lib.rs:3:16
|
3 |设项=数据[0];
|^^^^^^发生移动是因为值的类型为'std::option::option',该类型未实现'Copy'特性
|
帮助:考虑借用“选项”的内容
|
3 |设项=数据[0]。如_ref();
|                ^^^^^^^^^^^^^^^^
帮助:考虑在这里借款
|
3 |设项=&数据[0];
|                ^^^^^^^^
当我试图将其更改为
是一个引用时,当我试图将
数据[0]
设置为
时,会出现一个错误,这也是有意义的

有什么方法可以让我做我想做的吗?在我看来,无论我是否想要返回一个引用,我都必须从Vec获得元素的所有权

我注意到
Vec
有一个
swap\u remove
方法,它几乎完全符合我的要求,只是它与
Vec
中已经存在的元素交换,而不是像我所希望的那样与任意值交换。我知道我可以将
None
附加到
Vec
的末尾,然后使用
swap\u remove
,但我想看看是否有其他方法。

使用:

使用std::mem;
fn pop(数据:&mut Vec)->选项{
mem::replace(&mut数据[0],无)
}
replace
实质上是用另一个值替换特定位置中的值,并返回以前的值

另见:


顺便说一句,要用
None
替换可选值,在
选项
上有一种特殊方法,称为。如果适用的话,我会说使用它而不是
replace()
,更为惯用。我不敢相信vec本身没有一个方法
use std::mem;

fn pop<T>(data: &mut Vec<Option<T>>) -> Option<T> {
    mem::replace(&mut data[0], None)
}