struct MyStruct {
s: String,
}
impl Copy for MyStruct {}
fn main() {
let s1 = MyStruct { s: String::from("hello") };
let s2 = s1; // 编译错误!
println!("{}, {}", s1.s, s2.s);
}
以上代码将无法编译并出现以下错误:
|
4 | impl Copy for MyStruct {}
| ^^^^ `std::string::String` cannot be copied
...
7 | let s2 = s1; // 编译错误!
| -- value moved here
...
为了让MyStruct支持Copy trait,可以将String类型改为&str类型作为结构体字段类型,代码如下:
struct MyStruct<'a> {
s: &'a str,
}
impl<'a> Copy for MyStruct<'a> {}
fn main() {
let s1 = MyStruct { s: "hello" };
let s2 = s1;
println!("{}, {}", s1.s, s2.s);
}
在这个例子中,我们使用了一个引用来代替堆分配的String类型。同时,由于我们使用了引用类型,我们需要为MyStruct定义一个生命周期来防止出现借用错误。