1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
/// # 用作标签的trait:Copy /// /// 实现Copy必须也实现Clone /// /// Base usage: /// /// ``` /// struct MyStruct; /// impl Copy for MyStruct { } /// impl Clone for MyStruct { /// fn clone(&self) -> MyStruct { /// *self /// } /// } /// ``` /// /// Base usage: 可以用derive属性自动生成Copy /// /// ``` /// #[derive(Copy, Clone)] /// struct MyStruct; /// ``` pub fn impl_clone(){ struct MyStruct; impl Copy for MyStruct { } impl Clone for MyStruct { fn clone(&self) -> MyStruct { *self } } } /// # 用作标签的trait:Copy /// /// 在Rust中一共有五种主要的标签trait: /// /// - Sized。用来标识编译期可确定大小的类型。 /// - Unsize。目前该Trait为实验特性,用于标识动态大小类型(DST)。 /// - Copy。用来标识可以按位复制其值的类型。 /// - Send。用来标识可以跨线程安全通信的类型。 /// - Sync。用来标识可以在线程间安全共享引用的类型。 /// /// Base usage: 检测是否实现Copy trait的函数 /// /// ``` /// fn test_copy<T: Copy>(i: T) { /// println!("hhh"); /// } /// let a = "String".to_string(); /// test_copy(a); /// ``` pub fn test_copy_trait(){ fn test_copy<T: Copy>(i: T) { println!("hhh"); } let a = "String"; test_copy(a); } /// # 用作标签的trait:Sync / Send /// /// Base usage: error /// 利用所有权机制化解了一次并发危机 /// ``` /// use std::thread; /// let mut x = vec![1, 2, 3, 4]; /// thread::spawn(|| { // Error: may outlive borrowed value `x` /// x.push(1); // 子线程修改x /// }); /// x.push(2); // 父线程修改x /// ``` /// /// Base usage: right /// 使用move关键字, /// ``` /// use std::thread; /// let mut x = vec![1, 2, 3, 4]; /// thread::spawn(move || { // x实现了Sync和Send /// x.push(1); /// }); /// //x.push(2); // 父线程不允许修改x /// ``` /// /// Base usage: 未实现Sync和Send的类型示范 /// ``` /// use std::thread; /// use std::rc::Rc; /// /// let x = Rc::new(vec![1, 2, 3, 4]); /// thread::spawn( move || { // Error: std::marker::Send is not satisfied /// x[1]; /// }); /// ``` pub fn sync_send_trait(){ use std::thread; let mut x = vec![1, 2, 3, 4]; thread::spawn(move || x.push(1)); }