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

相关推荐
Bio Coder23 分钟前
学习用 Javascript、HTML、CSS 以及 Node.js 开发一个 uTools 插件,学习计划及其周期
javascript·学习·html·开发·utools
Allen zhu30 分钟前
【PowerHarmony】电鸿蒙学习记录-准备工作
学习·华为·harmonyos
华清远见成都中心1 小时前
物联网学习路线来啦!
物联网·学习
hgy89691 小时前
Ekman理论回归
学习
坚硬果壳_1 小时前
《硬件架构的艺术》笔记(一):亚稳态
笔记·学习
糊涂君-Q2 小时前
Python小白学习教程从入门到入坑------第三十一课 迭代器(语法进阶)
python·学习·程序人生·考研·职场和发展·学习方法·改行学it
qiyi.sky2 小时前
JavaWeb——Web入门(8/9)- Tomcat:基本使用(下载与安装、目录结构介绍、启动与关闭、可能出现的问题及解决方案、总结)
java·前端·笔记·学习·tomcat
dal118网工任子仪2 小时前
web安全漏洞之ssrf入门
笔记·学习·计算机网络·网络安全
键盘敲没电2 小时前
【iOS】知乎日报前三周总结
学习·ios·objective-c·xcode
Lyqfor2 小时前
云原生学习
java·分布式·学习·阿里云·云原生