我可以使用resize,但似乎有点过头了,因为我不需要调整向量的大小,只需修改其值即可。不能选择使用新变量,因为此向量实际上是结构中的一个字段。
我猜这resize是有效的,可能是我的问题的答案,但是它的名称并不具有在不更改大小的情况下重置值的含义。
在C语言中,我将使用memset(反对realloc)。
我的问题的插图:
let my_vec_size = 42;
let mut my_vec = Vec::new(); // 'my_vec' will always have a size of 42
my_vec.resize(my_vec_size, false); // Set the size to 42, and all values to false
// [ ... ] piece of code where the values in 'my_vec' will be modified, checked, etc ...
// now I need to reuse my_vec.
// Possibility A -> use resize again
my_vec.resize(my_vec_size, false);
// Possibility B -> iterate on the vector to modify its values (long and laborious)
for item in my_vec.iter_mut() {
*item = false;
}
// Possibility C ?
Run Code Online (Sandbox Code Playgroud)
resize其本身无法“重置”值:
const LEN: usize = 3;
fn main() {
let mut values = vec![false; LEN];
values[0] = true;
values.resize(LEN, false);
println!("{:?}", values); // [true, false, false]
}
Run Code Online (Sandbox Code Playgroud)
只需使用 for 循环:
for v in &mut values {
*v = false;
}
println!("{:?}", values); // [false, false, false]
Run Code Online (Sandbox Code Playgroud)
如果这种景象冒犯了你,请写一个扩展特征:
trait ResetExt<T: Copy> {
fn reset(&mut self, val: T);
}
impl<T: Copy> ResetExt<T> for [T] {
fn reset(&mut self, value: T) {
for v in self {
*v = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
values.reset(false);
println!("{:?}", values); // [false, false, false]
Run Code Online (Sandbox Code Playgroud)
如果这对您的情况有意义的话,可以扩展特征思想,以便每个值都知道如何重置自身:
trait ResetExt {
fn reset(&mut self);
}
impl<T: ResetExt> ResetExt for [T] {
fn reset(&mut self) {
for v in self {
v.reset();
}
}
}
impl ResetExt for bool {
fn reset(&mut self) {
*self = false;
}
}
impl ResetExt for String {
fn reset(&mut self) {
self.clear();
}
}
Run Code Online (Sandbox Code Playgroud)
values.reset();
println!("{:?}", values); // [false, false, false]
Run Code Online (Sandbox Code Playgroud)
通常,最有效的方法是自行重置值(也称为B):
for item in &mut my_vec { *item = false; }
Run Code Online (Sandbox Code Playgroud)
对于布尔值,并不是立即显而易见的,但是对于a String而言,保留每个元素的已分配缓冲区很重要:
for item in &mut my_vec { item.clear(); }
Run Code Online (Sandbox Code Playgroud)
如果丢弃和重新创建的元素Vec很便宜(例如布尔值的情况),或者如果元素将被覆盖,则将clear和组合起来resize会更容易:
my_vec.clear();
my_vec.resize(my_vec_size, false);
Run Code Online (Sandbox Code Playgroud)