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

相关推荐
不太可爱的叶某人2 小时前
【学习笔记】MySQL技术内幕InnoDB存储引擎——第5章 索引与算法
笔记·学习·mysql
岁岁岁平安2 小时前
Redis基础学习(五大值数据类型的常用操作命令)
数据库·redis·学习·redis list·redis hash·redis set·redis string
知识分享小能手4 小时前
Vue3 学习教程,从入门到精通,使用 VSCode 开发 Vue3 的详细指南(3)
前端·javascript·vue.js·学习·前端框架·vue·vue3
pay4fun4 小时前
2048-控制台版本
c++·学习
知识分享小能手5 小时前
Bootstrap 5学习教程,从入门到精通,Bootstrap 5 表单验证语法知识点及案例代码(34)
前端·javascript·学习·typescript·bootstrap·html·css3
weixin_418813876 小时前
Python-可视化学习笔记
笔记·python·学习
Haoea!6 小时前
Flink-05学习 接上节,将FlinkJedisPoolConfig 从Kafka写入Redis
学习·flink·kafka
丁满与彭彭7 小时前
嵌入式学习笔记-MCU阶段-DAY01
笔记·单片机·学习
呼啦啦--隔壁老王8 小时前
dexopt学习待整理
学习
无限远的弧光灯8 小时前
c语言学习_函数递归
c语言·开发语言·学习