如何取得Vec元素的所有权并将其替换为其他元素?

时间:2015-10-18 23:10:14

标签: rust lifetime

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

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,但我有兴趣了解是否有另一种方式。

1 个答案:

答案 0 :(得分:11)

使用std::mem::replace

use std::mem;

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

replace基本上将特定位置的值替换为另一个值并返回先前的值。