面试题答案
一键面试- 什么样的类型可以实现Copy语义:
- 基本类型:像整数类型(
i32
、u8
等)、浮点类型(f32
、f64
)、布尔类型(bool
)、字符类型(char
)等都实现了Copy
语义。这些类型的数据存储在栈上,它们的复制成本很低,直接按位复制即可。 - 元组类型:当元组内所有元素都实现
Copy
语义时,该元组类型也实现Copy
语义。例如(i32, bool)
,因为i32
和bool
都实现了Copy
,所以(i32, bool)
也实现了Copy
。 - 数组类型:当数组元素实现
Copy
语义时,该数组类型实现Copy
语义。例如[i32; 5]
,由于i32
实现Copy
,所以[i32; 5]
也实现Copy
。
- 基本类型:像整数类型(
- 如何判断一个类型是否支持Copy:
- 编译时错误提示:尝试将一个值赋给另一个值(会触发复制行为),如果类型不支持
Copy
,编译器会报错。例如:
- 编译时错误提示:尝试将一个值赋给另一个值(会触发复制行为),如果类型不支持
struct MyStruct {
data: String
}
fn main() {
let s1 = MyStruct { data: "hello".to_string() };
let s2 = s1; // 这里会报错,因为MyStruct不支持Copy
// 错误提示:`MyStruct` doesn't implement `Copy`
}
- 使用
std::marker::Copy
trait:可以通过在代码中使用std::marker::Copy
这个trait来判断。例如:
use std::marker::Copy;
struct MyStruct {
num: i32
}
impl Copy for MyStruct {}
impl Clone for MyStruct {
fn clone(&self) -> MyStruct {
MyStruct { num: self.num }
}
}
fn main() {
let _ = <MyStruct as Copy>::is_implemented(); // 这里不会报错,说明MyStruct实现了Copy
}
如果一个类型实现了Copy
trait,说明它支持Copy
语义。并且通常实现Copy
的类型也会自动实现Clone
trait ,Clone
trait提供了更通用的复制行为。