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
Post a Comment