面试题答案
一键面试Rust中Copy trait的适用范围
Copy trait适用于那些在复制时可以简单地进行按位复制的数据类型。当一个类型实现了Copy trait,意味着它的实例在被赋值或作为参数传递时,会进行值的复制,而不是所有权的转移。
常见自动实现Copy trait的数据类型
- 基本数值类型:如
i32
、u64
、f32
、f64
等。例如:
let num1: i32 = 10;
let num2 = num1; // 这里num1的值被复制给num2
- 字符类型:
char
。比如:
let c1: char = 'a';
let c2 = c1; // c1的值被复制给c2
- 布尔类型:
bool
。示例:
let b1: bool = true;
let b2 = b1; // b1的值被复制给b2
- 元组(如果其所有元素都实现了Copy trait):例如
(i32, u32)
:
let t1: (i32, u32) = (10, 20);
let t2 = t1; // t1的值被复制给t2
自定义结构体实现Copy trait的条件
自定义结构体要实现Copy trait,其所有成员都必须实现Copy trait。例如:
struct Point {
x: i32,
y: i32,
}
// 由于i32实现了Copy trait,Point结构体也可以实现Copy trait
impl Copy for Point {}
impl Clone for Point {
fn clone(&self) -> Point {
*self
}
}
let p1 = Point { x: 1, y: 2 };
let p2 = p1; // p1的值被复制给p2
通常,如果结构体成员中包含像String
(其内部持有堆上的数据且实现了Drop
trait)或Vec<T>
这类不实现Copy trait的类型,那么该结构体就不能实现Copy trait。