学习 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中的切片允许我们引用集合中的连续元素序列,提供了对数据操作的更细粒度控制。我们探讨了如何使用数组和字符串字面量创建切片,理解了范围语法及其排他性。

相关推荐
李游Leo32 分钟前
TypeScript + React 全栈学习:别只背语法,先把项目链路跑通
学习·react.js·typescript
SH202509171 小时前
2026适合备考大学生上网课使用的考试季学习辅助工具推荐
学习
江沉晚呤时1 小时前
用 C# 玩转 Scriban:自动生成报告、代码、文本,效率提升 10 倍
数据库·microsoft·c#·.net
蓝桉~MLGT1 小时前
中级软考(软件工程师)常用错题整理
学习·中级软考
_李小白1 小时前
【android opencv学习笔记】Day 9: 颜色检测算法
android·opencv·学习
南境十里·墨染春水1 小时前
linux 学习进展 网络编程 ——HTTP 协议详解
linux·网络·学习
中小企业实战军师刘孙亮1 小时前
中小实体如何逆势稳健发展?重塑经营逻辑是关键!佛山鼎策创局破局增长咨询
学习·面试·创业创新·制造·学习方法
码农小韩1 小时前
QT学习记录(三)——C++学习基础(三)
开发语言·c++·qt·学习·算法·嵌入式软件
承渊政道1 小时前
【动态规划算法】(似包非包以及卡特兰数问题深入解析)
数据结构·c++·学习·算法·leetcode·动态规划·哈希算法