2015-10-18 28 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()'更具慣用。 –

相關問題