如何在不使用集合的情况下修改它?
How do I modify a collection without consuming it?
我想在归还之前就地修改一个集合:
fn main() {
println!("{:?}", compute()); // should print [[2, 1, 0], [5, 4, 3]]
}
// u8 is just a placeholder, so impl Copy is considered cheating :)
fn compute() -> Vec<Vec<u8>> {
let a = vec![0, 1, 2];
let b = vec![3, 4, 5];
let mut result = Vec::new();
result.push(a);
result.push(b);
// avoids allocations from:
//
// result.iter()
// .map(|r| {
// r.reverse()
// r
// })
// .collect::<Vec<_>>()
result.into_iter().for_each(|mut r| r.reverse());
// errors out: the collection was consumed the line above
result
}
一个集合已经分配了 Vec::new()
,所以在这里分配第二个集合似乎是一种浪费。我假设这就是 .collect()
所做的。
- 如何避免分配过多?
- 有什么简单的方法可以知道发生了多少分配?在 golang 中,它就像
go test -bench=.
一样简单,但在 Rust 中我找不到任何类似的东西。
您需要对每个内部向量使用 &mut
,为此您可以只使用 iter_mut
,它使用 &mut Self
而不是 Self
作为外部向量矢量.
// u8 is just a placeholder, so impl Copy is considered cheating :)
fn compute() -> Vec<Vec<u8>> {
let a = vec![0, 1, 2];
let b = vec![3, 4, 5];
let mut result = Vec::new();
result.push(a);
result.push(b);
result.iter_mut().for_each(|r| r.reverse());
result
}
我想在归还之前就地修改一个集合:
fn main() {
println!("{:?}", compute()); // should print [[2, 1, 0], [5, 4, 3]]
}
// u8 is just a placeholder, so impl Copy is considered cheating :)
fn compute() -> Vec<Vec<u8>> {
let a = vec![0, 1, 2];
let b = vec![3, 4, 5];
let mut result = Vec::new();
result.push(a);
result.push(b);
// avoids allocations from:
//
// result.iter()
// .map(|r| {
// r.reverse()
// r
// })
// .collect::<Vec<_>>()
result.into_iter().for_each(|mut r| r.reverse());
// errors out: the collection was consumed the line above
result
}
一个集合已经分配了 Vec::new()
,所以在这里分配第二个集合似乎是一种浪费。我假设这就是 .collect()
所做的。
- 如何避免分配过多?
- 有什么简单的方法可以知道发生了多少分配?在 golang 中,它就像
go test -bench=.
一样简单,但在 Rust 中我找不到任何类似的东西。
您需要对每个内部向量使用 &mut
,为此您可以只使用 iter_mut
,它使用 &mut Self
而不是 Self
作为外部向量矢量.
// u8 is just a placeholder, so impl Copy is considered cheating :)
fn compute() -> Vec<Vec<u8>> {
let a = vec![0, 1, 2];
let b = vec![3, 4, 5];
let mut result = Vec::new();
result.push(a);
result.push(b);
result.iter_mut().for_each(|r| r.reverse());
result
}