How do I implement Copy and Clone for a type that contains a String (or any type that doesn't implement Copy)?
Copy
Copy
designates types for which making a bitwise copy creates a valid instance without invalidating the original instance.
This isn't true for String
, because String
contains a pointer to the string data on the heap and assumes it has unique ownership of that data. When you drop a String
, it deallocates the data on the heap. If you had made a bitwise copy of a String
, then both instances would try to deallocate the same memory block, which is undefined behaviour.
Since String
doesn't implement Copy
, your enum
cannot implement Copy
either because the compiler enforces that Copy
types are composed only of Copy
data members.
Clone
Clone
merely provides a standard clone
method, and it's up to each implementor to decide how to implement it. String
does implement Clone
, so you can put #[derive(Clone)]
on your enum
.
I did some exploring to see what a manual implementation would look like for an enum. I came up with this, but keep in mind you can also do #[derive(Clone)]
as stated elsewhere and the compiler will do this for you.
enum Simple {
Error(String),
Okay,
Foo([u32; 5]),
}
impl Clone for Simple {
fn clone(&self) -> Simple {
match self {
Error(a) => Error(a.to_string()),
Okay => Okay,
Foo(a) => Foo(a.clone()),
}
}
}