我以字符串向量的形式接收数据,并且需要使用值的子集填充结构,如下所示:
const json: &str = r#"["a", "b", "c", "d", "e", "f", "g"]"#;
struct A {
third: String,
first: String,
fifth: String,
}
fn main() {
let data: Vec<String> = serde_json::from_str(json).unwrap();
let a = A {
third: data[2],
first: data[0],
fifth: data[4],
};
}
这不起作用,因为我将值移出向量。编译器认为这data会导致未初始化的状态,但由于我不再使用data,所以没关系。
传统的解决方案是swap_remove,但这是有问题的,因为元素不是以相反的顺序访问的(假设结构是从上到下填充的)。
我现在通过执行 amem::replace和拥有dataas来解决这个问题mut,这会使原本干净的代码变得混乱:
fn main() {
let mut data: Vec<String> = serde_json::from_str(json).unwrap();
let a = A {
third: std::mem::replace(&mut data[2], "".to_string()),
first: std::mem::replace(&mut data[0], "".to_string()),
fifth: std::mem::replace(&mut data[4], "".to_string())
};
}
这个解决方案是否有替代方案,不需要我进行所有这些replace电话,而且是data不必要的mut?