3838
3939mod  uninit; 
4040
41- /// A common trait for the ability to explicitly duplicate an object. 
41+ /// A common trait that allows explicit creation of a duplicate value. 
42+ /// 
43+ /// Calling [`clone`] always produces a new value. 
44+ /// However, for types that are references to other data (such as smart pointers or references), 
45+ /// the new value may still point to the same underlying data, rather than duplicating it. 
46+ /// See [`Clone::clone`] for more details. 
47+ /// 
48+ /// This distinction is especially important when using `#[derive(Clone)]` on structs containing 
49+ /// smart pointers like `Arc<Mutex<T>>` - the cloned struct will share mutable state with the 
50+ /// original. 
4251/// 
4352/// Differs from [`Copy`] in that [`Copy`] is implicit and an inexpensive bit-wise copy, while 
4453/// `Clone` is always explicit and may or may not be expensive. In order to enforce 
@@ -147,7 +156,16 @@ mod uninit;
147156#[ rustc_diagnostic_item = "Clone" ]  
148157#[ rustc_trivial_field_reads]  
149158pub  trait  Clone :  Sized  { 
150-     /// Returns a copy of the value. 
159+     /// Returns a duplicate of the value. 
160+      /// 
161+      /// Note that what "duplicate" means varies by type: 
162+      /// - For most types, this creates a deep, independent copy 
163+      /// - For reference types like `&T`, this creates another reference to the same value 
164+      /// - For smart pointers like [`Arc`] or [`Rc`], this increments the reference count 
165+      ///   but still points to the same underlying data 
166+      /// 
167+      /// [`Arc`]: ../../std/sync/struct.Arc.html 
168+      /// [`Rc`]: ../../std/rc/struct.Rc.html 
151169     /// 
152170     /// # Examples 
153171     /// 
@@ -157,6 +175,23 @@ pub trait Clone: Sized {
157175     /// 
158176     /// assert_eq!("Hello", hello.clone()); 
159177     /// ``` 
178+      /// 
179+      /// Example with a reference-counted type: 
180+      /// 
181+      /// ``` 
182+      /// use std::sync::{Arc, Mutex}; 
183+      /// 
184+      /// let data = Arc::new(Mutex::new(vec![1, 2, 3])); 
185+      /// let data_clone = data.clone(); // Creates another Arc pointing to the same Mutex 
186+      /// 
187+      /// { 
188+      ///     let mut lock = data.lock().unwrap(); 
189+      ///     lock.push(4); 
190+      /// } 
191+      /// 
192+      /// // Changes are visible through the clone because they share the same underlying data 
193+      /// assert_eq!(*data_clone.lock().unwrap(), vec![1, 2, 3, 4]); 
194+      /// ``` 
160195     #[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
161196    #[ must_use = "cloning is often expensive and is not expected to have side effects" ]  
162197    // Clone::clone is special because the compiler generates MIR to implement it for some types. 
0 commit comments