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);
}