我正在编写以下格式的函数:
fn pop(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
}
当我尝试这样做时,我得到一个&#34;无法移出索引内容&#34;错误,这是有道理的。当我尝试更改item
作为参考时,我在尝试将data[0]
设置为None
时出错,这也是有道理的。
我有什么办法可以做我想做的事吗?在我看来,无论我是否想要返回引用,我都必须从Vec获得该元素的所有权。
我注意到Vec有一个swap_remove
方法,它几乎完全符合我的要求,除了它与Vec中已有的元素交换,而不是我想要的任意值。我知道我可以将None
添加到Vec的末尾并使用swap_remove
,但我有兴趣了解是否有另一种方式。
答案 0 :(得分:11)
use std::mem;
fn pop<T>(data: &mut Vec<Option<T>>) -> Option<T> {
mem::replace(&mut data[0], None)
}
replace
基本上将特定位置的值替换为另一个值并返回先前的值。