【Rust】切片类型

devtools/2025/3/15 7:00:01/

目录

思维导图

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 代码实现

rust">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 改进后的函数

rust">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 示例代码

rust">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[..]
}
  • 该实现支持对字符串和字符串切片的调用,增强了函数的通用性。例如,我们可以这样调用函数:

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

5. 其他切片类型

5.1 数组切片

  • Rust中还有其他切片类型,例如数组切片,使用方法类似:
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.ppmy.cn/devtools/150256.html

相关文章

spring mvc源码学习笔记之九

在前面的文章中,我们简单讲了可以用 WebApplicationInitializer 接口去替换 web.xml。 本文对这一块再做个详细讲解。 在 WebApplicationInitializer 这个接口的 javadoc 中有提到可以用继承 AbstractAnnotationConfigDispatcherServletInitializer 的方式替换实现 …

论文阅读:《Whole-animal connectomes of both Caenorhabditis elegans sexes》

一 论文整体概述 论文下载链接:《Whole-animal connectomes of both Caenorhabditis elegans sexes》 补充信息和额外数据:https://www.nature.com/articles/s41586-019-1352-7 1. 作者期刊背景 该论文由Scott W. Emmons,David H. Hall等…

用 HTML5 Canvas 和 JavaScript 实现雪花飘落特效

这篇文章将带您深入解析使用 HTML5 Canvas 和 JavaScript 实现动态雪花特效的代码原理。 1,效果展示 该效果模拟了雪花从天而降的动态场景,具有以下特点: 雪花数量、大小、透明度和下落速度随机。雪花会在屏幕底部重置到顶部,形成循环效果。随窗口大小动态调整,始终覆盖…

数据链路层-STP

生成树协议STP(Spanning Tree Protocol) 它的实现目标是:在包含有物理环路的网络中,构建出一个能够连通全网各节点的树型无环逻辑拓扑。 选举根交换机: 选举根端口: 选举指定端口: 端口名字&…

网络基础1 http1.0 1.1 http/2的演进史

http1.0 1.1 http/2的演进史😎 (连接复用 队头阻塞 服务器推送 2进制分帧) 概述 我们主要关注的是应用层 传输层 http协议发展历史 http的报文结构:起始行 Header Body http的典型特征 http存在的典型问题 Keep Alive机制 chun…

深度可分离卷积在卷积神经网络中的作用

1. 什么是深度可分离卷积 理解深度可分离卷积的概念,我们可以从两个关键词入手:"深度"和"可分离"。 深度(Depthwise):在深度可分离卷积中,"深度"指的是对输入特征图的每个…

【IDEA】配置篇

配置篇 取消打开最后打开的项目 鼠标滚轮放大缩小文字 过长或自适应屏幕的换行 目录自动跟随选项卡文件 我们希望查看哪个类代码,左边项目目录就能跟随显示这个文件所在位置,如下图,勾选这个选项即可 设置文件编码为 UTF-8 让注释加在行开头…

Golang中使用 Mqtt

MQTT 是一种基于发布/订阅模式的 轻量级物联网消息传输协议 ,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。 本文主要介绍如何在 Golang 项目中使用 github.com/eclips…