Rust中变量的复制与Copy trait

示例程序:

fn main() {
    let x = 123;
    let y = x;
    println!("x = {}, y = {}", x, y);   // 输出 x = 123, y = 123
}

上述程序中,在创建变量 y 之后,变量 x 继续有效。(而不会想 String 的赋值一样发生移动)

这是因为对于包括整型在内的一些类型来说,在编译时可以得知自己的大小,并且能够将自己的数据完整地存储在栈内存中。因为数据的拷贝全部发生在栈内存中,所以不会有移动的行为发生,所以此时就是完整地数据的拷贝。

Rust 提供了一个名为 Copy 的 trait,它可以应用在诸如整数这样完整地存储在栈上的数据类型。

一旦某种数据类型拥有了 Copy trait,它的变量就可以在赋值给其他变量之后保持可用性。

如果一种类型本身或者这种类型的任意成员实现了 Drop trait,那么 Rust 就不允许其实现 Copy trait。尝试在给某个需要在离开作用域时执行特殊指令(即实现了drop)的类型实现 Copy 这种 trait 会导致编译时错误。

拥有 Copy trait 的数据类型

  • 所有的整数类型,比如 u32。
  • 布尔类型:bool。
  • 字符类型:char。
  • 所有的浮点类型,比如 f64。
  • 如果元组包含的所有字段都是 Copy 的,那么这个元素也是 Copy 的。例如:(i32, i32) 是 Copy 的,但 (i32, String) 则不是。
posted @ 2022-01-24 18:10  鱼又悲  阅读(912)  评论(0编辑  收藏  举报