Rust含String字段的结构体映射问题:寻求更优雅解决方案
解决方案
针对你的问题,有两种更优雅的处理方式,取决于是否需要保留原a_list:
1. 不需要保留原列表时(最优解)
直接使用into_iter()替代iter(),这样会消耗原向量,获取每个A的所有权,从而可以直接将name的所有权转移给B的id,无需任何复制操作:
let b_list = a_list.into_iter().map(|a| B { id: a.name }).collect::<Vec<_>>();
这种方式效率最高,因为没有额外的内存分配,只是转移了字符串的所有权。
2. 需要保留原列表时
如果必须保留a_list,则需要复制字符串,使用String的clone()方法比你当前的转&str再转String更简洁直观:
let b_list = a_list.iter().map(|a| B { id: a.name.clone() }).collect::<Vec<_>>();
clone()是String类型原生的复制方法,和as_str().to_string()效果完全一致,但写法更符合Rust的惯用风格。
错误原因说明
你最初使用iter()时,得到的是原向量中元素的不可变引用(&A),此时a.name关联的原字符串还属于a_list中的元素,无法直接转移所有权。而String没有实现Copy trait,编译器会禁止这种可能破坏原数据的move操作,这就是报错的根源。
内容的提问来源于stack exchange,提问作者Sebastian Dine
相关产品推荐
相关产品推荐

