Rust学习(12):slice

slice是String的一部分引用。类似切片。

文章目录

  • 字符串slice
  • 数组slice

字符串slice

字符串slice:是一些存储在别处的UTF-8编码字符串数据的引用。
slice获取值的使用权但是没有得到值得所有权

fn main() {
    let s = String::from("Hello world");

    let hello = &s[0..5]; //[start, end)
    let world = &s[6..11]; //[start, end);
    println!("{},{}", hello, world);

    let hello = &s[..5]; //[0, end)
    let world = &s[6..]; //[start, len);
    let string = &s[..]; //[0, len)
    println!("{},{}, {}", hello, world, string);


    let hello = &s[0..=4]; //[start, end]
    let world = &s[6..=10]; //[start, end]
    println!("{},{}", hello, world);
}

Rust学习(12):slice_第1张图片

数组slice

slice可以访问数组的一部分而不用进行拷贝。可以看成是数据的引用[或者视图]

fn main() {
    let a = [1, 2, 3, 4, 5];
    let slice = &a[1..3];   //类型是&[i32] ,表示访问数组索引为 
    println!("{}, {}", slice[0], slice[1]);
}

在底层,slice代表一个指向数据开始的指针和一个长度。
Rust学习(12):slice_第2张图片

fn main() {
    fn mut_array(a:&mut [i32]){
        a[2] = 55;
    }

    println!("size of &[i32, 3]: {:?}", std::mem::size_of::<&[i32; 3]>());  //8:占用的空间大小与指针相同
    println!("size of &[i32, 3]: {:?}", std::mem::size_of::<&[i32]>()) ;    //16

    let mut v:[i32; 3] = [1, 2, 3];
    {
        let s : &mut [i32; 3] = &mut v;
        mut_array(s); //引用没有获取值的所有权,因此修改了原数组的值
    }
    println!("{:?}", v)
}

在这里插入图片描述
引用没有获取值的所有权,因此修改了原数组的值

参考:https://kaisery.github.io/trpl-zh-cn/ch04-03-slices.html
https://kaisery.gitbooks.io/rust-book-chinese/content/content/Primitive Types 原生类型.html

你可能感兴趣的:(#,rust)