学习 Rust 的第八天:如何进行数组分片

大家好,

欢迎来到学习rust的第8天,在前几天我已经完成了所有权、引用和其他重要概念。这将是本章的最后一集,明天我将开始学习结构体。

引言

在rust中,切片(Slices)允许你引用集合中的连续元素序列,而不是整个集合。

rust 复制代码
let numbers = [1, 2, 3, 4, 5];  
let slice = &numbers[1..4]; // [2, 3, 4]
  • [1..4] 从索引1开始,到3结束,4是排除的。
  • [1..=4] 从索引1开始,到4结束。

可视化表示

字符串切片

rust 复制代码
fn first_word(s: &String) -> usize {  
  let bytes = s.as_bytes();   
  for (i, &item) in bytes.iter().enumerate() {  
    if item == b' ' {  
      return i;  
    }  
  }  
  s.len()  
}

这个函数以字符串作为参数,并返回第一个 空格 字符的索引。

  • fn first_word(s: &String) -> usize {: 定义了一个函数来查找字符串中第一个空格字符的索引。
  • let bytes = s.as_bytes();: 将字符串转换为字节数组。
  • for (i, &item) in bytes.iter().enumerate() {: 遍历数组中的每个字节,跟踪其索引。
  • if item == b' ' { return i; }: 如果找到空格字符,则返回其索引。
  • s.len(): 如果未找到空格字符,则返回字符串的长度,表示整个字符串是"第一个单词"。

它成功编译并且没有错误,但这个函数有两个问题。

rust 复制代码
fn main() {  
  let s: String = String::from("Hello World");  
  let word_index: usize = first_word(&s); // word_index = 5  
  s.clear(); //现在字符串是空的  
  //word_index仍然是5,但是字符串是空的,因此这个值是无用的  
}

第二个问题是它的实现方式。如果我们用这种实现方式获取第二个单词,我们的函数定义会是这样的

rust 复制代码
fn second_word(s: &String) -> (usize, usize) {  
 ...  
}

字符串切片的工作原理与切片相同,只不过它们用在字符串上,例如:

rust 复制代码
fn main() {  
  let s: String = String::from("Hello World");  
  let hello: &str = &s[0..5];  
  println!("{}", hello);  
}

现在我们对函数和字符串切片有了基本的理解,让我们修改我们的函数。

rust 复制代码
fn first_word(s: &str) -> &str {  
  let bytes: &[u8] = s.as_bytes();  
  
  for (i, &item) in bytes.iter().enumerate() {  
    if item == b' ' {  
      return &s[0..i];  
    }  
  }  
  &s[..]  
}  
fn main() {  
    let string: &str = "Hello World!";  
    let word = first_word(&string);  
    println!("{}", word);  
}
  • fn first_word(s: &str) -> &str {: 定义了一个函数来查找并返回字符串切片中的第一个单词。
  • let bytes: &[u8] = s.as_bytes();: 将字符串切片转换为字节切片。
  • for (i, &item) in bytes.iter().enumerate() {: 遍历字节切片中的每个字节,跟踪其索引。
  • if item == b' ' { return &s[0..i]; }: 如果找到空格字符,则返回从索引 0i 的子字符串的引用,表示第一个单词。
  • &s[..]: 如果未找到空格字符,则返回对原始字符串切片的引用,表示整个字符串是"第一个单词"。

为了练习,你可以创建一个函数,用这种方法获取第二个单词。祝你好运!

结论

总之,在学习Rust的第8天,我们深入了解了切片的概念。Rust中的切片允许我们引用集合中的连续元素序列,提供了对数据操作的更细粒度控制。我们探讨了如何使用数组和字符串字面量创建切片,理解了范围语法及其排他性。

相关推荐
艾莉丝努力练剑25 分钟前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
人生游戏牛马NPC1号2 小时前
学习 Flutter (三):玩安卓项目实战 - 上
android·学习·flutter
没有羊的王K5 小时前
SSM框架学习——day1
java·学习
时光追逐者6 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 46 期(2025年7.7-7.13)
c#·.net·.netcore
mit6.8246 小时前
Why C# and .NET are still relevant in 2025
c#
liulilittle6 小时前
.NET ExpandoObject 技术原理解析
开发语言·网络·windows·c#·.net·net·动态编程
林林要一直努力7 小时前
AOSP Settings模块问题初窥
android·学习·bug·android studio
军训猫猫头7 小时前
5.浏览本地文件获取路径与文件名称 C#例子 WPF例子
开发语言·c#·wpf
余大侠在劈柴9 小时前
pdf.js 开发指南:在 Web 项目中集成 PDF 预览功能
前端·javascript·学习·pdf
DevOps00810 小时前
在 Azure Linux 上安装 RustFS
rust·minio·分布式存储·s3·rustfs