Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing the last element of a Vec or a slice

Tags:

vector

rust

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.

like image 979
Dave Vogt Avatar asked Feb 02 '15 14:02

Dave Vogt


People also ask

How do you clear a vector in Rust?

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.

What does VEC mean in Rust?

A contiguous growable array type, written as Vec<T> , short for 'vector'.


1 Answers

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.

like image 120
Shepmaster Avatar answered Sep 22 '22 10:09

Shepmaster