You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 16:06:26