Rust 模式匹配借用内容问题

Rust 模式匹配借用内容问题,rust,Rust,因此,我有一段代码,它读取input.csv,在其中插入一列并将其写入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
,在其中插入一列并将其写入
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();

    for 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
}

所以我知道它对
u.email
感到不安,因为
r
正试图拥有它(?),但如何最好地处理这种情况呢?

下面是您代码中的一个稍微简化的部分,它说明了问题:

struct用户{
参考:字符串,
电子邮件:String
}
让用户=vec![
用户{reference:“1”.into(),电子邮件:a@a.com“.into()},
用户{reference:“2”.into(),电子邮件:b@b.com“.into()}
];
让记录:Vec=Vec![
vec![“1”。into()],
vec![“2.into()],
vec![“3.into()]
];
对于记录中的mut记录{
让usr=users.iter().find(| ur | ur.reference==record[0]);
匹配usr{
部分(u)=>记录。插入(1,u.email),
None=>record.insert(1,“未知”.into())
}
//用唱片做任何事
}
usr
中让usr
这里是类型
&User
,而不是
User
,因为
iter()
返回满足
迭代器的迭代器,因此
find()
返回
选项
。因此,您不能从
u:&User
中取出
字符串
——您不能从借用的引用中移出。顺便说一句,这是一个绝对正确的错误-如果允许,您的代码将在同一用户对应多条记录的情况下中断(这将需要多次将电子邮件移出同一用户)

这里最自然的方法就是使用
clone()

record.insert(1,u.email.clone())
它将创建包含在找到的
用户中的电子邮件字符串的副本,这正是您需要的。

谢谢,
u.email.clone()
正是我需要的。
error: cannot move out of borrowed content
               Some(u) => r.insert(1, u.email),
                                      ^