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 99 100 101 102 103 104
/// # 动态大小类型:str /// ### 探索&str的组成 /// /// Basic usage: /// /// ``` /// fn str_compose(){ /// let str = "Hello Rust"; /// let ptr = str.as_ptr(); /// let len = str.len(); /// println!("{:p}", ptr); // 0x555db4b96c00 /// println!("{:?}", len); // 10 /// } /// str_compose(); /// ``` pub fn str_compose(){ let str = "Hello Rust"; let ptr = str.as_ptr(); let len = str.len(); println!("{:p}", ptr); // 0x555db4b96c00 println!("{:?}", len); // 10 } /// # 动态大小类型:`[T]` /// ### 探索数组 /// /// Error usage: /// /// ``` /// // Error: `[u32]` does not have a constant size known at compile-time /// fn reset(mut arr: [u32]) { /// arr[0] = 5; /// arr[1] = 4; /// arr[2] = 3; /// arr[3] = 2; /// arr[4] = 1; /// println!("reset arr {:?}", arr); /// } /// let arr: [u32] = [1, 2, 3, 4, 5]; /// reset(arr); /// println!("origin arr {:?}", arr); /// ``` /// /// Right usage 1: 指定固定长度 /// /// ``` /// fn reset(mut arr: [u32; 5]) { /// arr[0] = 5; /// arr[1] = 4; /// arr[2] = 3; /// arr[3] = 2; /// arr[4] = 1; /// println!("reset arr {:?}", arr); /// } /// let arr: [u32; 5] = [1, 2, 3, 4, 5]; /// reset(arr); /// println!("origin arr {:?}", arr); /// ``` /// /// Right usage 2: 使用胖指针 /// /// ``` /// fn reset(arr: &mut[u32]) { /// arr[0] = 5; /// arr[1] = 4; /// arr[2] = 3; /// arr[3] = 2; /// arr[4] = 1; /// println!("reset arr {:?}", arr); /// } /// let mut arr = [1, 2, 3, 4, 5]; /// println!("reset before : origin array {:?}", arr); /// { /// let mut_arr: &mut[u32] = &mut arr; /// reset(mut_arr); /// } /// println!("reset after : origin array {:?}", arr); /// ``` pub fn reset(mut arr: [u32; 5]) { arr[0] = 5; arr[1] = 4; arr[2] = 3; arr[3] = 2; arr[4] = 1; println!("reset arr {:?}", arr); } /// # 动态大小类型:比较`&[u32; 5]`和`&mut [u32]`的空间占用 /// /// Base usage: /// /// ``` /// fn compare_size(){ /// assert_eq!(std::mem::size_of::<&[u32; 5]>(), 8); /// assert_eq!(std::mem::size_of::<&mut [u32]>(), 16); /// } /// compare_size(); /// ``` pub fn compare_size(){ use std::mem::size_of; assert_eq!(size_of::<&[u32; 5]>(), 8); assert_eq!(size_of::<&mut [u32]>(), 16); }