【Rust自学】8.4. String类型 Pt.2:字节、标量值、字形簇以及字符串的各类操作
8.4 String类型 Pt.2字节、标量值、字形簇以及字符串的各类操作8.4.0. 本章内容第八章主要讲的是 Rust 中常见的集合。Rust 提供了很多集合类型的数据结构这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。第八章中的集合是存储在堆内存上而非栈内存上的这也意味着这些集合的数据大小无需在编译时就确定在运行时它们可以动态地变大或变小。本章主要会讲三种集合Vector、String本文和 HashMap。8.4.1. 不能使用索引来访问StringRust 中的String不同于其他语言不能用索引访问。如下例fn main() { let s String::from(6657 up up); let a s[0]; }输出error[E0277]: the type str cannot be indexed by {integer} -- src/main.rs:3:15 | 3 | let a s[0]; | ^ string indices are ranges of usize | help: the trait SliceIndexstr is not implemented for {integer} note: you can use .chars().nth() or .bytes().nth() for more information, see chapter 8 in The Book: https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings note: required for String to implement Index{integer}报错说明String类型无法使用整数来进行索引。继续往下看可以看到String没有实现Index{integer}这个 trait。8.4.2.String类型的内部表示String是对Vecu8的包装其中u8表示字节。我们可以通过String上的len()方法来返回字符串的长度。如下例fn main() { let len String::from(Niko).len(); println!({}, len); }输出4这个字符串采用的是UTF-8编码len的值为4也就是这个字符串占了 4 个字节。所以在这个例子里每个字母占用了一个字节。但情况并不总是这样。比如说我们把字符串换成其他语言这里是西里尔字母写的俄语fn main() { let hello String::from(Здравствуйте); println!({}, hello.len()); }如果你数一下这个字符串会发现有 12 个字母但是输出却是24也就是说在这个语言里面一个字母会占用两个字节中文是一个汉字占三个字节。这里所说的“字母”用专业术语表示就是Unicode 标量值而这里的每个西里尔字母都对应两个字节。通过这个例子你可以发现对String做数字索引并不总能对应到一个完整的 Unicode 标量值因为有的标量值会占不止一个字节而数字索引一次只能读到一个字节。再举个例子西里尔字母З对应两个字节这两个字节的值分别是 208 和 151。假如数字索引是允许的那么取Здравствуйте的索引0就会得到208而单独的208是没有意义的因为它缺少组成一个 Unicode 标量值所需的第二个字节。所以为了避免这种无法立即发现的 bugRust 禁止了对String使用数字索引从而在开发早期就杜绝可能的误解。8.4.3. 字节、标量值、字形簇Rust 中有三种看待字符串的方式字节、标量值和字形簇。其中字形簇最接近我们通常所说的“字母”。1. 字节看个例子fn main() { let s String::from(नमस्ते); // 天城文书写的印地语 for b in s.bytes() { print!({} , b); } }这段天城文字符串看起来好像有 4 个字母。我们使用.bytes()方法来获得它所对应的字节。输出如下224 164 168 224 164 174 224 164 184 224 165 141 224 164 164 224 165 135这 18 个字节就是计算机存储该字符串的样子。2. 标量值我们再来以 Unicode 标量值的形式来看待它fn main() { let s String::from(नमस्ते); for b in s.chars() { print!({} , b); } }使用.chars()方法能够获得这段字符串所对应的标量值。输出如下न म स ् त े它有 6 个标量值其中有些是组合标记而不是独立的字母。它们只有和前面的字符组合在一起才有意义。这也解释了为什么这段天城文字符串占 18 个字节6 个标量值每个占 3 个字节6 × 3 18 个字节。3. 字形簇因为从String里获得字形簇很复杂所以 Rust 标准库没有提供这个功能这里也就不做演示但你可以从 crates.io 找第三方 crate 来实现这个功能。总之如果这串字符串以字形簇的形式打印出来会是这样8.4.4. 为什么String不能被索引数字索引取出来的值可能并不完整无法组成一个完整的 Unicode 标量值从而导致无法第一时间察觉的错误。索引操作理应消耗常量时间也就是O(1)而String无法保证这一点要找到第n个字符必须从字符串开头向后扫描因为每个字符占用的字节数可变。8.4.5. 切割String可以使用[]在里面填上范围来创建字符串切片。关于字符串切片的详细内容见 4.5. 切片Slice。如下例fn main() { let hello String::from(Здравствуйте); let s hello[0..4]; println!({}, s); }刚才也说了一个西里尔字母占两个字节。这里的字符串切片切的是字符串的前 4 个字节也就是前两个字母。输出是Зд那如果字符串切片切的是前三个字节呢也就意味着切片的内容会是第一个字母加上半个第二个字母。这种情况会怎么样呢看下面的例子fn main() { let hello String::from(Здравствуйте); let s hello[0..3]; println!({}, s); }输出thread main panicked at src/main.rs:3:19: end byte index 3 is not a char boundary; it is inside д (bytes 2..4 of string) note: run with RUST_BACKTRACE1 environment variable to display a backtrace程序触发了panic!错误信息是结束字节索引3不是一个char边界。也就是说切割时必须沿着char的边界来切割对于西里尔字母来说就是按两个字节为单位切割。8.4.6. 遍历String对于标量值使用.chars()方法。如下例fn main() { let s String::from(नमस्ते); for b in s.chars() { print!({} , b); } }对于字节使用.bytes()方法。如下例fn main() { let s String::from(नमस्ते); for b in s.bytes() { print!({} , b); } }对于字形簇标准库未提供方法但可以使用第三方 crate。

相关新闻

【Rust自学】8.5. HashMap Pt.1:HashMap的定义、创建、合并与访问

【Rust自学】8.5. HashMap Pt.1:HashMap的定义、创建、合并与访问

8.5 HashMap Pt.1:HashMap的定义、创建、合并与访问 8.5.0. 本章内容 第八章主要讲的是 Rust 中常见的集合。Rust 提供了很多集合类型的数据结构,这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。 第八章中的集合是存储在堆内存上而…

2026/7/23 18:49:41 阅读更多 →
腺相关病毒载体构建伯远生物腺相关病毒载体

腺相关病毒载体构建伯远生物腺相关病毒载体

腺相关病毒载体构建伯远生物腺相关病毒载体 伯远生物是国家级专精特新小巨人企业,国家级重点实验室,牵头多项省部级重大专项,公司科研技术人员500(硕博占比40%以上),作为功能基因研究综合性平台&#xff0c…

2026/7/23 18:49:41 阅读更多 →
办公自动化专用 OpenClaw 部署教程,内置全套运行组件(含安装包)

办公自动化专用 OpenClaw 部署教程,内置全套运行组件(含安装包)

Windows 平台 OpenClaw 部署实操|短时搭建本地 AI 智能体,简化环境配置流程 内容核心 图形化操作界面|自动化环境适配|内置完整运行组件|28 万 Tokens 资源额度|多系统兼容适配 适配版本:Open…

2026/7/23 18:48:41 阅读更多 →

最新新闻

供应链合同数字化:从成本中心到效率引擎的三大路径

供应链合同数字化:从成本中心到效率引擎的三大路径

在企业的合同管理体系中 传统纸质合同模式下,供应链合同的管理存在几个系统性问题:签署周期长拖慢采购节奏、合同版本混乱导致条款不一致、履约跟踪靠人工容易遗漏、发生纠纷时举证困难。这些问题单个看起来都不致命,但叠加在一起&#xff0c…

2026/7/23 19:04:46 阅读更多 →
faster-whisper 等语音转文字的python包,支持gpu和cpu模式

faster-whisper 等语音转文字的python包,支持gpu和cpu模式

一、先解决 faster-whisper 安装失败问题 1. 分开执行命令,不要一次性管道过滤,方便看完整报错 打开 CMD,依次执行: C:/Python/Python312/python.exe -m pip install --user faster-whisper如果网络超时/下载失败,换国…

2026/7/23 19:04:46 阅读更多 →
电子合同ROI深度解析:制造业年省142万,三年累计节省410万

电子合同ROI深度解析:制造业年省142万,三年累计节省410万

企业在评估是否引入电子合同时,第一个问题往往是"能省多少钱"。这个问题的答案并不简单——电子合同的成本节省不是单一维度的,而是贯穿合同生命周期的多个环节。本文以制造业为样本,构建一个可复用的成本测算框架,并结…

2026/7/23 19:04:46 阅读更多 →
frp内网穿透

frp内网穿透

frp内网穿透frp内网穿透参考文章FRP服务端配置步骤1. 准备工作2. 下载并安装FRP1.下载FRP2.解压文件3. 配置FRP服务端4. 配置阿里云安全组5. 启动 FRP 服务端6测试与验证FRP客户端服务端配置步骤windows配置其他token 生成frp内网穿透 参考文章 frp实现内网穿透(一…

2026/7/23 19:04:46 阅读更多 →
GEO优化AI搜索排名:本地化数字营销实战指南

GEO优化AI搜索排名:本地化数字营销实战指南

1. 项目背景与需求解析在上海闵行区开展GEO优化AI搜索排名业务,本质上是在解决企业本地化数字营销的核心痛点。这个需求背后反映的是当前企业获客渠道从传统线下向线上精准投放转移的大趋势。我接触过不少闵行区的制造型企业主,他们最常抱怨的就是&#…

2026/7/23 19:04:46 阅读更多 →
企业级AI Agent平台:客服、销售、IT、财务与理赔自动化实践

企业级AI Agent平台:客服、销售、IT、财务与理赔自动化实践

架构基座与调度机制 传统规则引擎面临维护成本过高问题。大语言模型赋予系统复杂推理能力。平台架构已突破单轮对话局限。多智能体协作成为企业标配。核心模块包含意图识别组件。向量记忆库提供跨会话支撑。工具层打通外部异构系统。决策中枢负责任务拆解。数据流向制约响应延迟…

2026/7/23 19:03:46 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻