我正在试图理解所有权是如何在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);
}

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`.

Rust相关问答推荐

将JSON密钥转换为Polars DataFrame

Rust中的相互递归特性与默认实现

如何最好地并行化修改同一Rust向量的多个切片的代码?

在0..1之间将U64转换为F64

更合理的方法来设计样条线函数器?

在Rust内联程序集中使用字符串常量

如何在Rust中缩短数组

什么时候使用FuturesOrdered?

Rust proc_macro 和 syn:解析空格

使用启用优化的 alloc 会导致非法指令崩溃

如何基于常量在Rust中跳过一个测试

trait 对象指针的生命周期

如何在 Rust 中按 char 对字符串向量进行排序?

在异步 Rust 中,Future 如何确保它只调用最近的 Waker?

&str 的编译时拆分是否可能?

If let expression within .iter().any

为实现特征的所有类型实现显示

使用 `.` 将 T 转换为 &mut T?

A 有一个函数,它在 Option<> 类型中时无法编译,但在 Option<> 类型之外会自行编译.为什么?

list 中没有指定目标 - 必须存在 src/lib.rs、src/main.rs、[lib] 部分或 [[bin]] 部分