Rust语言- Slice(切片)类型(&[u8])

Rust语言- Slice(切片)类型(&[u8])

slice是一个没有所有权的数据类型,其允许你引用集合中一段连续的元素序列,而不引用整个集合,通用语义如下:

slice是一种动态类型DST(Dynamically Sized Types),无法直接使用slice,都需要将其隐藏在指针后面使用,常用的方式如下:

  • &[T]:shared slice
  • &mut [T]:mutable slice
  • Box:boxed slice

动态类型(Dynamically Sized Types)

大部分类型在编译时都有确定的大小,并且编译器会自动为类型实现trait Sized。如果一个类型只能在运行时才能确定大小,则该类型称为 DST(Dynamically Sized Type),也可以说unsized type 。Slices和Trait Objects是两种常见的DSTs。

字符串字面值

原文链接:https://www.cnblogs.com/microwang/p/16029155.html

字符串字面值被直接存储在二进制程序中

let s = "Hello,World!";

变量 s 的类型是 &str ,它是一个指向二进制程序特定位置的切片, &str 是不可变引用,所以字符串字面值也是不可变的

将字符串切片作为参数传递:

fn main() {
    
    
    let my_string = String::from("Hello world");
    let wordIndex = first_word(&my_string[..]);

    let my_string_literal = "hello world";
    let wordIndex = first_word(my_string_literal);
}

fn first_word(s: &str) -> &str {
    
    
    let bytes = s.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
    
    
        if item == b' ' {
    
    
            return &s[..i];
        }
    }
    &s[..]
}

关于:
fn first_word(s: &String) -> &str {
fn first_word(s: &str) -> &str {

使用 &str作为参数类型,可以同时接受String和&str类型的参数。

定义函数时,使用字符串切片代替字符串引用会使用我的API更加通用。

Rust中的String与str

Rust中的String,&str和str都是什么?
参考URL: https://zhuanlan.zhihu.com/p/384496181
在这里插入图片描述
String和str完全不同两个东西。

  • String是什么?
    String可以看作由三个变量所组成的结构体,第一个变量为指向一块堆上连续内存的指针,第二个变量为这块内存里已经使用的总大小。第三个变量为这块内存的总长度capacity。
    String在new的时候从堆里申请内存,在drop的时候释放内存。
    String内部的指向的连续内存可以看作为u8的数组,String的使用接口确保了内部存储的确实为合法的UTF-8编码的字节。

  • &str是什么?
    &str是对String的一种借用形式,被称为字符串切片。
    由于&str的特殊性让其与普通的引用区分开,这种携带了元数据的特殊引用也被称为胖指针。
    &str非常有用,它能够引用String类型的多个不同子字符串而无需复制,避免复制。

let heap_string:String =Hello World.to_string();
let substring1:&str =&string [1..3];
let substring2:&str =&string [2..4];

字符串切片

最简单、最常用的数据切片类型是字符串切片(String Slice):

fn main() {
    
    
    println!("字符串切片----->");
    let s = String::from("broadcast");

    let part1 = &s[0..5];
    let part2 = &s[5..9];

    println!("{}={}+{}", s, part1, part2);
}

这就是创建切片的语法,使用方括号包括的一个序列: [开始索引…终止索引。

切片并不是Rust独有的概念,在Go语言中就非常流行,它允许你引用集合中一段连续的元素序列,而不是引用整个集合。

part1 没有引用整个String s,而是引用了s的一部分内容,通过[0…5]的方式来指定。
对于let part2= &s[5…9];来说,part2是一个切片,该切片的指针指向s的第6个字节(索引从0开始,5是第6个字节),且该切片的长度是4个字节。

非字符串切片

除了字符串以外,其他一些线性数据结构也支持切片操作,例如数组:

fn main() {
    
    
    //非字符串切片
    println!("非字符串切片----->");
    let arr = [1, 3, 5, 7, 9];
    let part = &arr[0..3];
    for i in part.iter() {
    
    
        println!("{}", i);
    }
}

&[u8]

Rust从&[u8] bytes中读取任意类型的整数(如i32, u32等多种类型)
参考URL: https://blog.csdn.net/qq_26373925/article/details/111087884

u8

Rust 原始类型。8位无符号整数类型。它可以存放从零到 255 的值。

猜你喜欢

转载自blog.csdn.net/inthat/article/details/118878522