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)
则不是。