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),
^