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定义一个生命周期来防止出现借用错误。