rust 为什么一个整型变量在赋值给另一个变量后仍然可以使用?

zengzsys  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(140)

我试图理解所有权在Rust中是如何运作的,考虑下面这个简单的例子:

let u_own = 3432;
let d_own = u_own;
println!("{}", u_own);

编译器没有抱怨,尽管值3432的所有权已经转移到d_own。最后一条语句println!在控制台上打印数字3432没有任何问题。
我原以为编译器会因为所有权被移动而抱怨。

4ioopgfo

4ioopgfo1#

所有权永远不会移动。对于任何标记为std::marker::Copy的类型(我们说类型“是Copy”),赋值运算符不会移动所有权。它创建该值的副本。
Rust中的基元类型默认为Copy,您可以在自己的任何类型上派生该标记,但应将其保留给小类型。简单枚举通常为Copy
如果使用的类型不是Copy,则会出现预期的行为。例如,String

fn main() {
    let u_own = String::new();
    let d_own = u_own;
    println!("{}", u_own);
}

playground

error[E0382]: borrow of moved value: `u_own`
 --> src/main.rs:4:20
  |
2 |     let u_own = String::new();
  |         ----- move occurs because `u_own` has type `String`, which does not implement the `Copy` trait
3 |     let d_own = u_own;
  |                 ----- value moved here
4 |     println!("{}", u_own);
  |                    ^^^^^ value borrowed here after move
  |
  = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)

For more information about this error, try `rustc --explain E0382`.

相关问题