Use `clone()` when you need a separate owned value while retaining the original. The method comes from Rust’s `Clone` trait. Assignment and borrowing are not substitutes for an explicit clone: borrowing gives access through a reference, while cloning creates another value. section 5.3
Keep an independent vector
```rust let mut cities = vec!["Chicago", "Houston"]; let saved = cities.clone(); cities.push("Phoenix"); assert_eq!(saved, vec!["Chicago", "Houston"]); ``` Cloning the vector preserves its earlier contents in `saved`; the later push changes only `cities`. section 5.3
For a struct whose fields implement `Clone`, `#[derive(Clone)]` supplies the implementation. A derived clone calls cloning recursively on its fields. Use it when duplication is intended, not merely to get around choosing between ownership and a reference. section 4.5.3 section 5.3
Before duplicating large or frequently processed values, check the operation’s signature:
- `&self -> &str` generally returns borrowed data; `&self -> String` may allocate a new owned result. section 5.4
- `&mut self` may update the existing value. For ASCII strings, `make_ascii_lowercase()` modifies in place, whereas `to_lowercase()` returns a new `String`. section 5.4
- Do not assume `String -> String` avoids a copy just because it consumes its input: an implementation can still construct a new string. section 5.4




