这里 c 转化成 iterator::IntoIterator 并调用 into_iter() 方法,由于 Counter 没有实现 Copy trait,c 也会移动到 iter 可变变量上,所以这里就可以修改内部变量。
内部会不断循环调用,知道 next 方法返回 None。
所以 for...in 在类型没有实现 Copy 的时候会移动变量,后续也不能再使用这个变量。
1 2 3 4 5 6 7 8 9 10 11 12
fnmain() { letc = Counter { count: 0 }; foriin c { println!("{}", i); } println!("{}", c.count); // Error // borrow of moved value: `c` // value borrowed here after moverustc(E0382) // main.rs(19, 14): value moved here // main.rs(18, 9): move occurs because `c` has type `Counter`, which does not implement the `Copy` trait // main.rs(19, 14): consider borrowing to avoid moving into the for loop }
如果我们为 Counter 加上 Copy 和 Clone trait,那么这里就不会报错了,但是由于 for 循环仅仅复制了 c 数据,所以最后还是打印值为 0