rust - Get the last element of a vector and push it to the same vector -


what trying do:

enum test {     value1,     value2,     value3 }  fn main() {     let mut test_vec: vec<test> = vec::new();     test_vec.push(test::value2);      if let some(last) = test_vec.last() {         test_vec.push(*last);     }     //wanted output: vector [test::value2, test::value2] } 

i understand when call last(), return option<&test> borrow test_vec till end of if-let block.

i tried following without success:

if let some(last) = test_vec.last().map(|v| v.clone()) {     test_vec.push(*last); }  //and  let last = test_vec.last().unwrap().clone(); test_vec.push(*last); 

when trying figure out why borrow checker complains can useful identify types involved.

if type out:

let _: () = test_vec.last().map(|v| v.clone()); 

you error complaining () , core::option::option<&test> not same type.

what's going on? put, if clone &test &test, calling .map(|v| v.clone()) on option<&test> gives option<&test>. obviously, still borrows.

the same problem occurs next attempt, if type out:

let _: () = test_vec.last().unwrap().clone(); 

you error complaining () , &test not same type.

by calling unwrap on option<&test> &test cloned &test.


so, problem lack of dereferencing. need dereference earlier, avoid borrowing test_vec in some(last):

if let some(last) = test_vec.last().map(|v| (*v).clone()) {     test_vec.push(last); } 

of course, not work because test not implement clone. once fixed (by #[derive(clone)]), compiles.

since cloning references such common need, there dedicated method on option (and iterator) called cloned:

if let some(last) = test_vec.last().cloned() {     test_vec.push(last); } 

Popular posts from this blog

php - How should I create my API for mobile applications (Needs Authentication) -

5 Reasons to Blog Anonymously (and 5 Reasons Not To)

Google AdWords and AdSense - A Dynamic Small Business Marketing Duo