Rust中如何向Vec<&Vec<String>>的每个内部向量追加元素?
错误原因
你的代码没有生效是几个核心问题导致的:
- 你对内部向量调用了
clone(),后续的push操作全部是在克隆出来的临时副本上执行的,原向量没有任何改动,临时副本在闭包执行完就会被直接销毁。 - 如果你声明的类型真的是
Vec<&Vec<String>>,那集合里存的是内部向量的不可变共享引用,Rust的借用规则不允许你通过不可变引用修改内部数据,要修改的话你需要持有可变引用(即类型为Vec<&mut Vec<String>>),或者直接持有向量所有权(即类型为Vec<Vec<String>>)。 - 额外说明:
Vec::push方法的返回值是单元类型(),你原来写的map().collect()最终会得到一个装满无意义()值的向量,属于完全冗余的操作。
正确实现
场景1:你持有内部向量的所有权(最常见情况,类型为Vec<Vec<String>>)
不需要map和collect,直接遍历可变引用原地修改即可:
fn main() { let mut vec_of_strings = vec![ vec!["a1".to_string(), "b2".to_string(), "c3".to_string()], vec!["d1".to_string(), "e2".to_string(), "f3".to_string()], vec!["g1".to_string(), "h2".to_string(), "i3".to_string()] ]; // 循环写法可读性更高 for inner_vec in vec_of_strings.iter_mut() { inner_vec.push("something".to_string()); } // 偏好函数式写法可以用for_each,不需要map // vec_of_strings.iter_mut().for_each(|inner_vec| inner_vec.push("something".to_string())); println!("{:?}", vec_of_strings); }
运行后输出符合预期:
[["a1", "b2", "c3", "something"], ["d1", "e2", "f3", "something"], ["g1", "h2", "i3", "something"]]
场景2:你持有的是内部向量的可变引用集合(类型为Vec<&mut Vec<String>>)
逻辑和上面完全一致,只要拿到的是合法的可变引用,就可以直接原地修改:
fn main() { let mut v1 = vec!["a1".to_string(), "b2".to_string(), "c3".to_string()]; let mut v2 = vec!["d1".to_string(), "e2".to_string(), "f3".to_string()]; let mut v3 = vec!["g1".to_string(), "h2".to_string(), "i3".to_string()]; let mut vec_of_strings: Vec<&mut Vec<String>> = vec![&mut v1, &mut v2, &mut v3]; vec_of_strings.iter_mut().for_each(|inner_vec| inner_vec.push("something".to_string())); println!("{:?}", vec_of_strings); }
内容的提问来源于stack exchange,提问作者kinxiel
相关产品推荐
相关产品推荐

