我正在尝试完成一些相当简单的事情,但不知道如何在Rust中实现。
我有一个Vec<&Vec>,类似于下面的例子。
[
["a1", "b2", "c3"],
["d1", "e2", "f3"],
["g1", "h2", "i3"]
]
我想在每个向量的末尾添加一个字符串。
[
["a1", "b2", "c3", "something"],
["d1", "e2", "f3", "something"],
["g1", "h2", "i3", "something"]
]
到目前为止,我尝试的是下面的:
vec_of_strings
.iter_mut()
.map(|x| x.clone().push("something".to_string()))
.collect::<Vec<_>>();
println!("{:?}", vec_of_strings);
但是输出显示没有附加任何内容。
5条答案
按热度按时间iezvtpos1#
你正在做的是创建一个新的
Vec
,它不会修改现有的Vec
。事实上,现有的不能修改,因为你是不可改变地借用它们(Vec<&Vec<_>>
中的&
)。请注意,在这里使用
.iter_mut()
而不是.iter()
是没有意义的,因为您没有改变元素。此外,
Vec::push()
不返回任何内容,因此.to_string()
调用应该会给您一个编译时错误。(我假设你的意思是在字符串字面量上调用它。解决上述问题:
然而,这一切看起来都像是一个XY problem--可能有一个更好的方法来实现您的目标。
8aqjt8rx2#
如果我理解正确的话,你需要在
map
中返回一个vec
。Rust Playground
vybvopom3#
我认为对
map
方法的用途存在误解。此方法通常用于原始值保持不变的数据转换。你在这里实际上做的是引起副作用,map
方法在这里根本帮不上忙。使用
for
循环。这不像你通过使用Map和交互器来节省时间。但是,你提到你有一个
Vec<&Vec>
。拥有这种类型似乎不适合你的目的。克隆整个vec只是为了添加一个元素,这对性能来说是很糟糕的。我有两个选择:或者完全拥有,即
Vec<Vec>
,或者只是让内部的Vec
s可变,就像在Vec<&mut Vec>
中一样。这是第一个选项,我认为这是最惯用的:
如果不能接受拥有的形式,那么另一个选择是使用
Vec<&mut Vec>
:x8goxv8g4#
我假设你的输出看起来像这样:
以下是一些建议:
for_each
而不是map
进行突变:请注意,这假设
vec_of_strings
的定义类似于:Playground
.map
中的函数没有返回任何东西,因为Vec::push
没有返回向量。将
x
分隔到另一行以返回向量。请注意,这假设
vec_of_strings
的定义类似于:Playground
map
时,您可能还希望更明确地说明向量元素(&str
)的类型:而不是
由于
map
中的返回类型为Vec::push
,因此编译器将其推断为Vec<()>
(因此输出)。lkaoscv75#
一种保持原始格式的解决方案,将每个数组扩展一个条目:
Playground