浅拷贝(Copy语义)和深拷贝(Clone语义)在测试方法上的主要区别
- 浅拷贝(Copy语义):
- 测试特点:浅拷贝只复制栈上的数据,对于包含指针等指向堆内存数据的结构体,被拷贝对象和原对象会共享堆内存。测试时主要关注栈上数据的复制是否正确,并且检查是否没有额外的堆内存分配。例如对于一个简单的包含基本数据类型的结构体,测试其浅拷贝后,新对象和原对象的基本数据类型字段值是否一致,同时确认没有产生新的堆内存占用。
- 深拷贝(Clone语义):
- 测试特点:深拷贝会递归地复制所有数据,包括堆上的数据。测试时不仅要验证新对象和原对象的所有字段值一致,还要确保新对象有独立的堆内存空间,修改新对象的堆数据不会影响原对象。比如对于包含字符串(堆上存储内容)的结构体,测试深拷贝后,新对象的字符串内容和原对象一致,但它们在堆上的存储是独立的。
自定义结构体浅拷贝(Copy语义)测试示例
#[derive(Copy, Clone, Debug)]
struct Point {
x: i32,
y: i32,
}
#[test]
fn test_shallow_copy() {
let p1 = Point { x: 10, y: 20 };
let p2 = p1; // 这里发生浅拷贝(Copy语义)
assert_eq!(p1, p2);
assert_eq!(p1.x, p2.x);
assert_eq!(p1.y, p2.y);
}
自定义结构体深拷贝(Clone语义)测试示例
use std::clone::Clone;
struct MyString {
data: String,
}
impl Clone for MyString {
fn clone(&self) -> Self {
MyString {
data: self.data.clone(),
}
}
}
struct Container {
my_string: MyString,
}
impl Clone for Container {
fn clone(&self) -> Self {
Container {
my_string: self.my_string.clone(),
}
}
}
#[test]
fn test_deep_copy() {
let c1 = Container {
my_string: MyString {
data: "hello".to_string(),
},
};
let c2 = c1.clone(); // 这里发生深拷贝(Clone语义)
assert_eq!(c1.my_string.data, c2.my_string.data);
// 验证堆内存独立,修改c2不影响c1
c2.my_string.data.push_str(" world");
assert_ne!(c1.my_string.data, c2.my_string.data);
}