I have some code that looks like this:
trait Stack { fn top(&mut self) -> Option<f64>; } impl Stack for Vec<f64> { fn top(&mut self) -> Option<f64> { match self.pop() { None => None, Some(v) => { self.push(v); Some(v) } } } } fn main() { let mut stack: Vec<f64> = Vec::new(); stack.push(5.3); stack.push(2.3); stack.push(1.3); match stack.top() { Some(v) => println!("Top of the stack: {}", v), None => println!("The stack is empty"), } }
Right now, the top()
method is modifying self
, but I think that this should not be necessary. The obvious way to do it didn't really work:
fn top(&mut self) -> Option<f64> { match self.len() { 0 => None, n => self[n - 1], } }
I've toyed around a bit with converting usize
to i32
and back, but none of what I'm writing looks as short and readable as I think it should.
To remove all elements from a vector in Rust, use . retain() method to keep all elements the do not match. let mut v = vec![ "A", "warm", "fall", "warm", "day"]; let elem = "warm"; // element to remove v.
A contiguous growable array type, written as Vec<T> , short for 'vector'.
You can use slice::last
:
fn top(&mut self) -> Option<f64> { self.last().copied() }
Option::copied
(and Option::cloned
) can be used to convert from an Option<&f64>
to an Option<f64>
, matching the desired function signature.
You can also remove the mut
from both the implementation and the trait definition.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With