Rust 在迭代过程中修改结构是否有一个优雅的解决方案?
我试图构建一个点向量,这些点在迭代过程中发生了变化:Rust 在迭代过程中修改结构是否有一个优雅的解决方案?,rust,Rust,我试图构建一个点向量,这些点在迭代过程中发生了变化: struct Point { x: i16, y: i16, } fn main() { let mut points: Vec<Point> = vec![]; // unsure if point is mutable points.push(Point { x: 10, y: 10 }); // thus trying it explicitly let mut p1
struct Point {
x: i16,
y: i16,
}
fn main() {
let mut points: Vec<Point> = vec![];
// unsure if point is mutable
points.push(Point { x: 10, y: 10 });
// thus trying it explicitly
let mut p1 = Point { x: 20, y: 20 };
points.push(p1);
for i in points.iter() {
println!("{}", i.x);
i.x = i.x + 10;
}
}
据我所知,Rust不允许在迭代时修改结构,因此会出现错误
如何以优雅的方式修改它?如果我阅读并正确理解,我会想到以下几点:
您不能修改正在迭代的结构,即向量
点
。但是,修改从迭代器获得的元素是完全没有问题的,您只需选择可变性:
for i in points.iter_mut() {
或者,使用更现代的语法:
for i in &mut points {
可变性是可选的,因为可变迭代进一步限制了您在迭代时可以使用
点
。由于禁止可变别名(即指向同一内存的两个或多个指针,其中至少有一个是&mut
),因此在iter\u mut()
迭代器已经存在。现在你可以为i-in&mut点编写,因为它使用了迭代器
特性。@chrismorge,对了,我一直忘了这个。谢谢。适用于一个循环,但不适用于嵌套:用于i in&mut points.iter(){用于j in points.iter(){//一些东西并计算a}i.x=i.x+a;//错误:无法分配给不可变字段“i.x”
@Chris,该字段应给出与点相关的终生错误,而不是与i
相关的任何错误。事实上,当我在游戏笔中键入它时,它确实会这样做:这一次没有简单的解决方法(&mut
指针必须永不别名),所以您应该写一个单独的问题,完整地解释您要做的事情,以及为什么它需要可变性和嵌套循环。