I am writing a function of the following format:
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
}
When I try to do this, I get a "cannot move out of indexed content" error, which makes sense. When I try to change it such that item
is a reference, I get an error when I try to set data[0]
to None
, which also makes sense.
Is there some way I can do what I want to do? It seems to me that, whether I want to return a reference or not, I'm going to have to take ownership of the element from the Vec.
I noticed that Vec has a swap_remove
method, which does almost exactly what I want, except that it swaps with an element already in the Vec, not with any arbitrary value as I would like. I know that I could just append None
to the end of the Vec and use swap_remove
, but I'm interested in seeing if there's another way.
Use
std::mem::replace
:replace
essentially replaces the value in a particular location with another one and returns the previous value.