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

Cam*_*Sun 10 lifetime rust

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

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
}
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时,我得到一个"无法移出索引内容"错误,这是有道理的.当我试图改变它,从而item是一个参考,我得到一个错误,当我尝试设置data[0]None,这也是情理之中.

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

我注意到Vec有一个swap_remove方法,它几乎完全符合我的要求,除了它与Vec中已有的元素交换,而不是我想要的任意值.我知道我可以附加None到Vec的末尾并使用swap_remove,但我有兴趣看看是否还有另一种方法.

Fra*_*gné 12

用途std::mem::replace:

use std::mem;

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

replace 实质上用另一个值替换特定位置的值并返回先前的值.

  • BTW,为了用'None`替换一个可选值,`Option`上有一个特殊的方法,称为[`take()`](http://doc.rust-lang.org/core/option/enum.Option. HTML#method.take).我认为在适用的情况下使用它代替`replace()`更为惯用. (9认同)
  • 我不敢相信 vec 本身没有方法 (3认同)