Ответ дается в сообщении об ошибке вашего первого примера
error[E0382]: borrow of moved value: `x`
--> src/main.rs:6:40
|
2 | let x = vec![1, 2, 3];
| - move occurs because `x` has type `std::vec::Vec<i32>`, which does not implement the `Copy` trait
3 |
4 | let equal_to_x = move |z| z == x;
| -------- - variable moved due to use in closure
| |
| value moved into closure here
5 |
6 | println!("can't use x here: {:?}", x);
| ^ value borrowed here after move
«движение происходит, потому что x
имеет тип std::vec::Vec<i32>
, который не реализует черту Copy
»
Это означает, что когда тип реализует черту Copy
(как это делает i32
), перемещение копирует переменную в область действия замыкания.