2015-10-18 29 views
4

我写以下格式的函数:我如何获得Vec元素的所有权并将其替换为其他元素?

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 
} 

当我尝试这样做,我得到一个“不能搬出索引内容”的错误,这是有道理的。当我尝试将item作为参考进行更改时,当我尝试将data[0]设置为None时出现错误,这也是有道理的。

有什么办法可以做我想做的事吗?在我看来,无论我是否想要返回一个参考,我都必须从Vec中获取元素的所有权。

我注意到Vec有一个swap_remove方法,它几乎正是我想要的,除了它与已经在Vec中的元素进行交换,并没有任何随意的值。我知道我可以将None附加到Vec的末尾,并使用swap_remove,但我有兴趣查看是否有其他方法。

回答

6

使用std::mem::replace

use std::mem; 

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

replace基本上取代在另一个特定位置值,并返回以前的值。

+0

太棒了,谢谢! –

+5

顺便说一句,为了用'None'替换一个可选的值,'Option'上有一个特殊的方法,叫做['take()'](http://doc.rust-lang.org/core/option/enum.Option的.html#method.take)。我认为在适用的情况下使用它而不是'replace()'更具惯用。 –

相关问题