Re:Go: Redefining For Loop Variable Semantics
by kevincox on Tuesday October 11, 2022 @03:00PM
(#33167631)
Not quite how you tested it. The `move` is actually copying the variable:
fn main() {
let mut functions = vec![];
let mut i = 0;
functions.push(Box::new(move || println!("Hello {i}")) as Box<dyn Fn()>);
i = 1;
functions.push(Box::new(move || println!("Hello {i}")));
i = 2;
functions.push(Box::new(move || println!("Hello {i}")));
for func in functions {
func();
}
}
But the most equivalent code would be the following which doesn't compile: fn main() {
let mut functions = vec![];
for i in 0..10 {
functions.push(Box::new(|| println!("Hello {i}")))
}
for func in functions {
func();
}
}
Re:Go: Redefining For Loop Variable Semantics
by littlestymaar on Tuesday October 11, 2022 @04:55PM
(#33169128)
That's the point: the misleading code doesn't compile because the `i` variable scope in limited to the current execution of the loop (and that's why you can't borrow it for `functions`'s lifetime), which is exactly how ES6 fixed this in JavaScript.
Edit: looks like Rust does it right: https://play.rust-lang.org/?version=stable&mode=debug&editio...