【发布时间】:2017-01-24 15:30:38
【问题描述】:
我有以下几点:
enum SomeType {
VariantA(String),
VariantB(String, i32),
}
fn transform(x: SomeType) -> SomeType {
// very complicated transformation, reusing parts of x in order to produce result:
match x {
SomeType::VariantA(s) => SomeType::VariantB(s, 0),
SomeType::VariantB(s, i) => SomeType::VariantB(s, 2 * i),
}
}
fn main() {
let mut data = vec![
SomeType::VariantA("hello".to_string()),
SomeType::VariantA("bye".to_string()),
SomeType::VariantB("asdf".to_string(), 34),
];
}
我现在想在data 的每个元素上调用transform 并将结果值存储回data。我可以做类似data.into_iter().map(transform).collect() 的事情,但这会分配一个新的Vec。有没有办法就地执行此操作,重用分配的data 内存? Rust 中曾经有 Vec::map_in_place,但它已在前一段时间被删除。
作为一种变通方法,我向SomeType 添加了一个Dummy 变体,然后执行以下操作:
for x in &mut data {
let original = ::std::mem::replace(x, SomeType::Dummy);
*x = transform(original);
}
这感觉不对,我必须在代码中的其他任何地方处理SomeType::Dummy,尽管它在此循环之外永远不可见。有更好的方法吗?
【问题讨论】:
-
您应该更改
transform()的签名以接受可变引用而不是使用SomeType。 -
是的,使用可变引用会很容易,但是
transform()做了一些非常复杂的转换,特别是重新使用传入x的部分以产生结果,这是以这样的“函数式”风格更容易做到(如果可能的话,使用可变引用)。
标签: rust