rust - pattern matching borrowed content issue -


so have piece of code reads input.csv, inserts column in , writes output.csv

extern crate csv;  use std::path::path;  struct user {     reference: string,     email: string,     firstname: string,     lastname: string }  fn main() {      let mut rdr = csv::reader::from_file("/tmp/input.csv").unwrap().has_headers(false);     let mut wtr = csv::writer::from_file(path::new("/tmp/output.csv")).unwrap();      let users = get_users();      record in rdr.decode() {          let rec: option<vec<string>> = match record {             ok(rec) => some(rec),             err(e) => none         };          match rec {             some(mut r) => {                 let usr = users.iter().find(|&ur| ur.reference == r[27].to_string());                 match usr {                     some(u) => r.insert(1, u.email),                     none => r.insert(1, "unknown".to_string())                 }                 wtr.write(r.iter());             }             none => {}         };      }  }  fn get_users() -> vec<user> {     //retrieve users } 

and it's giving me error:

error: cannot move out of borrowed content                some(u) => r.insert(1, u.email),                                       ^ 

so understand it's getting upset u.email, because r trying take ownership of it(?), how best handle such situation?

here simplified portion of code demonstrates problem:

struct user {     reference: string,     email: string }  let users = vec![     user { reference: "1".into(), email: "a@a.com".into() },      user { reference: "2".into(), email: "b@b.com".into() } ];  let records: vec<vec<string>> = vec![     vec!["1".into()],      vec!["2".into()],      vec!["3".into()] ];  mut record in records {     let usr = users.iter().find(|ur| ur.reference == record[0]);     match usr {         some(u) => record.insert(1, u.email),         none => record.insert(1, "unknown".into())     }     // whatever record } 

usr in let usr here of type &user, not user, because iter() returns iterator satisfying iterator<item=&user>, , hence find() returns option<&user>. consequently, cannot take string out of u: &user - can't move out of borrowed reference. is, btw, absolutely correct error - if allowed, code break in situation multiple records corresponding same user (it require moving email out of same user multiple times).

the natural way here use clone():

record.insert(1, u.email.clone()) 

it create copy of email string contained in found user, need.


Comments

Popular posts from this blog

Java 3D LWJGL collision -

spring - SubProtocolWebSocketHandler - No handlers -

methods - python can't use function in submodule -