Rust系列(12):切片类型
  oS1xgoxjr0QZ 2023年11月02日 48 0

今天学习的内容是 Rust 中的切片类型

前面学习所有权时,学习了引用类型,它的特点是不拥有值的所有权。除了引用,Rust 中的切片(slice)类型,同样不持有值的所有权。

切片类型是对一个数组、字符串的引用片段。

切片有利于安全有效地访问数据的一部分,而不需要拷贝原始数据的内容。

切片在编译的时候,它的长度是未知的,在底层实现上,一个切片保存着两个 usize 类型的成员,第一个成员指向切片的起始位置的指针,第二个成员表示切片的长度。

字符串切片

字符串切片是指向 String 对象中某个连续部分的引用。

创建一个字符串切片,使用 & 表示,在方括号中设置切片的范围区间,格式为 [starting_index..ending_index],其中 starting_index 是切片起始位置的索引值,ending_index 是切片终止位置的索引值,在切片时不包含 ending_index

let str = String::from("hello world");
// 从 str 的索引0开始,取到第5个索引,这中间的5个字节作为一个切片
let hello = &str[0..5];

// 从 str 的索引6开始,取到第11个索引,这中间的5个字节作为一个切片
let world = &str[6..11];

.. 是 Rust 的 Range 范围语法,它有一些简化的用法:

// 从索引0开始取值,可以省略掉 0:
let hello = &str[..5];

// 取值到最后一个索引,也可以省略掉。
let world = &str[6..];

// 开始索引和结束索引都省略掉,表示创建一个指向完整内容的切片
let s = &str[..];

字符串字面量就是切片

前面学习字符串的类型时,提到了 Rust 中有多种不同类型的字符串,其中最常用的就是 &str 字符串引用类型和 String 类型。

创建一个 &str 类型的字符串,就是写一个字符串字面量:

let str = "hello world";

变量 str 的类型就是 &str,字符串字面量直接存储在二进制程序中,它就是一个指向二进制程序特定位置的切片。

数组切片

对一个数组(包括固定大小数组和动态数组)

fn main() {
    let arr: [u32; 5] = [1, 2, 3, 4, 5];

    // 取数组中的前三个值
    let slice = &arr[0..3];
}

切片类型的方法

切片类型有很多内置方法,介绍两个常用的:

  • is_empty :判断切片是否有内容
  • len:获取切片内容的长度
let arr: [u32; 5] = [1, 2, 3, 4, 5];
let slice = &arr[0..3];

println!("{}", slice.is_empty()); // false
println!("{}", slice.len()); // 3


小结

本文介绍了 Rust 中的切片类型, 包括字符串类型的切片,数组类型的切片。通过切片类型,加深了 Rust 中内存管理上的一点认识,切片就是数据在内存中一段位置的引用。所有权,引用,切片,这几个概念,使得 Rust 的内存更为安全。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  oS1xgoxjr0QZ   2023年11月02日   42   0   0 数组Rust
  oS1xgoxjr0QZ   2023年11月02日   32   0   0 Rust
  dBFTbkVLMBge   2023年11月02日   29   0   0 Rust
  oS1xgoxjr0QZ   2023年11月02日   39   0   0 Rust
  oS1xgoxjr0QZ   2023年11月02日   25   0   0 Rust
  oS1xgoxjr0QZ   2023年11月02日   41   0   0 Rust
  oS1xgoxjr0QZ   2023年11月02日   49   0   0 Rust
  y5zqVixaDLkE   2023年11月02日   34   0   0 RustmysqlPostgreSQL
oS1xgoxjr0QZ