如何将附加元素推送到 Vec<&Vec<String>>?

kin*_*iel 0 vector rust

我正在尝试完成一些相当简单的事情,但不知道如何在 Rust 中做到这一点。

我有一个 Vec<&Vec>,类似于下面的示例。

[
 ["a1", "b2", "c3"],
 ["d1", "e2", "f3"],
 ["g1", "h2", "i3"]
]
Run Code Online (Sandbox Code Playgroud)

我想在每个向量的末尾添加一个额外的字符串。

[
 ["a1", "b2", "c3", "something"],
 ["d1", "e2", "f3", "something"],
 ["g1", "h2", "i3", "something"]
]
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的如下:

vec_of_strings
    .iter_mut()
    .map(|x| x.clone().push("something".to_string()))
    .collect::<Vec<_>>();

println!("{:?}", vec_of_strings);
Run Code Online (Sandbox Code Playgroud)

但输出显示没有附加任何内容。

cdh*_*wie 5

您正在做的事情会创建一个新的Vec,它不会修改现有的。事实上,现有的无法修改,因为您一成不变地借用它们( in &Vec<&Vec<_>>

请注意,这里使用.iter_mut()not.iter()是没有意义的,因为您不会改变元素。

此外,Vec::push()不会返回任何内容,因此.to_string()调用应该会给出编译时错误。(我假设您打算在字符串文字上调用它。)

解决上述问题:

let new_vec_of_strings = vec_of_strings
  .iter()
  .map(|x| {
    let mut x = x.clone();
    x.push("something".to_string());
    x
  })
  .collect::<Vec<_>>();

println!("{:?}", new_vec_of_strings);
Run Code Online (Sandbox Code Playgroud)

然而,这一切似乎都是一个XY 问题——可能有更好的方法来实现您的目标。