fn name(&self) -> String {
        // self.name
        // two owner with two identical data
        self.name.clone() // deep copy
    }
// data stored in heap
// if we allow naively copy ref, then two pointers refer to same copy
//  two owners points to same memory
// we need a different way to create a copy of data not ref
data stored in heap
if we allow naively copy ref, then two pointers refer to same copy
two owners points to same memory
we need a different way to create a copy of data not ref
data stored in heap if we allow naively copy ref then two pointers refer to same copy two owners points to same memory we need a different way to create a copy of data not ref
fn name(&self) -> String {
        // self.name
        // two owner with two identical data
        self.name.clone() // deep copy
    }
fn name ( & self ) -> String { // self.name // two owner with two identical data self . name . clone ( ) // deep copy }
data stored in heap
if we allow naively copy ref, then two pointers refer to same copy
two owners points to same memory
we need a different way to create a copy of data not ref
data stored in heap if we allow naively copy ref then two pointers refer to same copy two owners points to same memory we need a different way to create a copy of data not ref
&self