Rust中无需for循环为多个结构体实例设置同一属性的方法
Rust中批量修改Vec中结构体属性的惯用写法
问题场景
我有一个Vec<MyStruct>,定义和初始化代码如下:
struct MyStruct { attr1: i32, // 其他字段... } let mut my_vec = Vec::new(); for _ in 1..100 { my_vec.push(MyStruct::new()); }
现在需要将这个Vec里所有实例的attr1属性设置为同一个值(比如42),目前我用for循环实现:
let new_attr1 = 42; for my_str in my_vec.iter_mut() { my_str.attr1 = new_attr1; }
想问有没有更符合Rust惯用风格的无循环实现方式?
解答
你当前的for循环写法本身就很符合Rust的惯用风格,不过也可以用迭代器的for_each方法来替代,写法更紧凑:
let new_attr1 = 42; my_vec.iter_mut().for_each(|s| s.attr1 = new_attr1);
这种方式和for循环本质等价,都是遍历可变引用并修改属性,只是用函数式的迭代器方法封装了循环逻辑,属于Rust社区认可的惯用写法之一。
需要说明的是:Rust里不存在真正意义上的"无循环"实现——不管用哪种写法,底层都必须遍历整个Vec的元素,for_each只是让代码形式更简洁。
另外,如果可以在初始化阶段就完成属性赋值,还能优化流程、避免后续修改:
let new_attr1 = 42; let my_vec: Vec<MyStruct> = (1..100) .map(|_| { let mut s = MyStruct::new(); s.attr1 = new_attr1; s }) .collect();
这种方式在创建每个MyStruct实例时直接赋值attr1,省去了后续遍历修改的步骤,效率也更优。
内容的提问来源于stack exchange,提问作者gmelodie
相关产品推荐
相关产品推荐

