我正在试图理解所有权是如何在Rust工作的.考虑下面这个简单的例子:
let u_own = 3432;
let d_own = u_own;
println!("{}", u_own);
尽管所有权已从值3432
移至d_own
,但编译器不会发出任何警告.最后一条语句是println!
,在控制台上打印数字3432
没有任何问题.
我以为编译器会抱怨,因为所有权已经被移动了.
我正在试图理解所有权是如何在Rust工作的.考虑下面这个简单的例子:
let u_own = 3432;
let d_own = u_own;
println!("{}", u_own);
尽管所有权已从值3432
移至d_own
,但编译器不会发出任何警告.最后一条语句是println!
,在控制台上打印数字3432
没有任何问题.
我以为编译器会抱怨,因为所有权已经被移动了.
所有权永远不会改变.对于任何标记为std::marker::Copy
的类型(我们说类型"is Copy"),赋值操作符不移动所有权.它会创建该值的副本.
Rust中的基元类型默认为Copy
,您可以自由地在您自己的任何类型上派生该标记,尽管您应该将其保留为较小的类型.简单的枚举通常是Copy
个.
如果您使用的类型不是Copy
,那么您的预期行为将会出现.例如,String
:
fn main() {
let u_own = String::new();
let d_own = u_own;
println!("{}", u_own);
}
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`.