当前位置: 首页 > article >正文

【Rust】切片类型

目录

思维导图

1. 切片类型概述

2. 函数示例:获取字符串中的第一个单词

2.1 问题描述

2.2 初步实现

2.3 代码实现

3. 切片的引入

3.1 切片的定义

3.2 切片的优势

3.3 改进后的函数

4. 函数参数的通用性

4.1 改进函数签名

4.2 示例代码

5. 其他切片类型

5.1 数组切片

6. &String与&str的区别


思维导图

1. 切片类型概述

  • 切片是一种引用类型,允许我们引用集合(如字符串、数组等)中的连续元素序列,而不需要引用整个集合。切片本身并不拥有数据,因此它不会转移所有权。这种特性使得切片在处理大型数据集时非常高效,同时避免了不必要的内存复制。

2. 函数示例:获取字符串中的第一个单词

2.1 问题描述

  • 编写一个函数,该函数接受一个由空格分隔的字符串,并返回第一个单词。如果字符串中没有空格,则返回整个字符串。

2.2 初步实现

  • 函数签名为 fn first_word(s: &String) -> ?
  • 通过将字符串转换为字节数组,逐个检查字节是否为空格,以找到第一个单词的结束位置。

2.3 代码实现

fn first_word(s: &String) -> usize {
    let bytes = s.as_bytes();[7][8]
    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return i;
        }
    }
    s.len()
}
  • 该函数返回第一个单词结束的字节索引,但存在潜在问题:返回的索引与字符串的状态不再相关联。如果字符串被修改,索引可能会失效,导致程序错误。

3. 切片的引入

3.1 切片的定义

  • 字符串切片是对字符串部分的引用,形式为 &s[start..end],其中 start 和 end 是切片的起始和结束位置。切片内部存储了起始位置和长度信息,确保引用的有效性。

3.2 切片的优势

  • 使用切片可以避免因索引失效而导致的错误。切片的类型为 &str,可以确保返回的引用始终有效。此外,切片的使用使得代码更加简洁和易读。

3.3 改进后的函数

fn first_word(s: &String) -> &str {
    let bytes = s.as_bytes();[7][8]
    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }
    &s[..]
}
  • 该函数返回字符串切片,确保了返回值与原字符串的有效性。通过使用切片,我们避免了返回索引可能带来的问题,同时提高了代码的健壮性。

4. 函数参数的通用性

4.1 改进函数签名

  • 为了增强函数的通用性和灵活性,我们可以更改函数签名为 fn first_word(s: &str) -> &str。这样,函数不仅可以接受 String 类型的引用,还可以接受字符串字面量和其他字符串切片。

4.2 示例代码

fn first_word(s: &str) -> &str {
    let bytes = s.as_bytes();
    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }
    &s[..]
}
  • 该实现支持对字符串和字符串切片的调用,增强了函数的通用性。例如,我们可以这样调用函数:

  • let my_string = String::from("hello world");
    let word = first_word(&my_string[..]);
    let word = first_word("hello world");

5. 其他切片类型

5.1 数组切片

  • Rust中还有其他切片类型,例如数组切片,使用方法类似:
let a = [1, 2, 3, 4, 5];
let slice = &a[1..3]; // slice为 [2, 3]

6. &String与&str的区别

特性&String&str
类型String的引用字符串切片,可以是String的一部分或字符串字面量
所有权引用String的所有权不拥有数据,只是一个视图
内存分布指向String的指针(包含长度和容量)指向字符串数据的指针和长度
灵活性只能引用String类型可以引用String或字符串字面量
使用场景明确需要String引用时使用通用字符串引用,推荐用于函数参数

tips:

  • iter() 返回集合的迭代器,用于遍历元素;
  • enumerate() 在迭代时同时返回元素的索引和值,方便在循环中获取位置信息;
  • 切片类型更灵活、更通用,尤其在用于函数参数方面。

http://www.kler.cn/a/501242.html

相关文章:

  • DDD - 微服务设计与领域驱动设计实战(上)_统一建模语言及事件风暴会议
  • 17_Redis管道技术
  • SQLAlchemy: python类的属性值为None,数据为JSON类型,插入数据库为‘ NULL‘字符串,而不是真正的NULL
  • 【云计算】OpenStack云计算平台
  • 【Pandas】pandas Series rtruediv
  • CentOS 和 Ubantu你该用哪个
  • 微信小程序mp3音频播放组件,仅需传入url即可
  • C++:string
  • 鸿蒙UI(ArkUI-方舟UI框架)
  • Python爬虫-爬取汽车之家全部汽车品牌的brandid(品牌ID)
  • 在 C# 中使用预处理器指令
  • VB.NET 正则表达式完全指南
  • 机器学习之避免过拟合的验证方法
  • HTML - 其他标签
  • ​​​​​​芯盾时代以数据为核心的车联网业务安全解决方案
  • Unity教程(二十)战斗系统 角色反击
  • 3. ML机器学习
  • 安卓app抓包总结(精)
  • 金山WPS Android面试题及参考答案
  • LLMs之VDB:LanceDB的简介、安装和使用方法、案例应用之详细攻略
  • openEuler22.03系统使用Kolla-ansible搭建OpenStack
  • scss不错的用法
  • AI在软件工程教育中的应用与前景展望
  • sql正则表达