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

Rust 中的字符串 slice 是什么?

文章目录0.前言1.核心定义2.字符串 slice 的两种常见来源3.String vs str4.示例代码5.切片索引注意事项6.为什么需要两种字符串类型7.总结参考文献0.前言在 Rust 中字符串 slicestr是一个对 UTF-8 编码的字符串数据段的不可变引用。它是 Rust 核心字符串类型之一用于在不拥有数据所有权的情况下高效地访问字符串的一部分或全部。1.核心定义语法str本质一个胖指针fat pointer包含两部分指向底层 UTF-8 字节序列的指针。字符串的长度单位是字节不是字符数。内存位置可以指向静态内存如字符串字面量、堆内存如String的某一部分或栈内存极少见。可变性不可变不能修改其指向的内容。2.字符串 slice 的两种常见来源来源示例说明字符串字面量let s: str Hello, world!;字面量类型是static str指向可执行文件的只读数据段。从String借用let s String::from(hello);let slice: str s;String实现了DerefTargetstr因此String可自动转换为str。从String切片let slice s[0..4];获取String中某一段字节的视图注意索引必须是 UTF-8 字符边界。3.String vs str特性Stringstr所有权拥有数据所有权借用数据无所有权内存位置堆可动态增长可指向静态内存、堆或栈的一部分可变性✅ 可修改如push_str❌ 不可变内部结构Vecu8指针、长度、容量胖指针指针、长度使用场景需要拥有、修改或传递字符串数据时需要只读访问字符串、函数参数等4.示例代码fnmain(){// 1. 字符串字面量static strlethello:strHello;// 指向静态内存// 2. 从 String 借用为 strletsString::from(world);letworld:strs;// 自动解引用强制转换// 3. 字符串 slice 切片从 String 中获取一部分letslice:strs[0..2];// wo取前两个字节println!(slice: {},slice);// 4. 字符串 slice 可以连接但需要转换为 Stringletcombinedformat!({} {},hello,world);println!({},combined);// Hello world}5.切片索引注意事项字符串 slice 的索引必须按字节来且必须落在 UTF-8 字符的边界上。否则程序会panic。lets你好;// let slice s[0..1]; // ❌ 运行时 panic因为 你 占 3 个字节索引 1 在字符中间letslices[0..3];// ✅ 你三字节println!({},slice);若需要按字符操作应使用.chars()方法。6.为什么需要两种字符串类型Rust 通过分离String拥有所有权的可变字符串和str借用的不可变视图实现了内存安全str的借用生命周期被编译器检查避免悬垂引用。零成本抽象字符串 slice 不会复制数据只创建视图。高效的 API 设计函数参数用str可以同时接受String和str无需额外转换。fngreet(name:str){println!(Hello, {}!,name);}fnmain(){letname1Alice;// strletname2String::from(Bob);// Stringgreet(name1);// ✅ 直接传 strgreet(name2);// ✅ 传 String自动转为 str}7.总结str是字符串的只读视图不拥有数据指向一段 UTF-8 编码的字节。字符串字面量的类型是static str。可通过String或s[start..end]获得str。它作为函数参数非常灵活是 Rust 字符串处理的首选类型。切片索引需按字节进行且必须位于字符边界。如果你希望进一步了解 UTF-8 编码边界和按字符操作的方法或是str类型与[u8]的异同我可以继续为你解释。参考文献Rust 程序设计语言中文版
http://www.gsyq.cn/news/1360461.html

相关文章:

  • 收藏干货|2026 新版 5 大高薪 AI 职业方向,零基础小白 程序员转型大模型绝佳参考
  • 宋钢揭秘加盟小米汽车缘由:小米跟特斯拉非常像 都追求极致
  • 别再死记硬背了!用ChatGPT当你的ReactJS私人教练,5天搞定组件和状态
  • 如何利用IP离线库拦截电商刷单?精准识别代理与机房流量的完整方案
  • 浅谈电商下单微服务流程
  • 从披萨到知识图谱:避开OWL本体建模的3个新手常见坑(Protege避坑指南)
  • Windows右键菜单终极清理指南:用ContextMenuManager告别杂乱,重获高效桌面
  • SpringBoot项目里,如何让ShardingSphere 5.x和dynamic-datasource和平共处?一个配置类搞定混合数据源
  • 通过Taotoken CLI工具一键为团队统一配置多款AI开发工具
  • 范式锁定与认知殖民:全球AI大停滞时代的中国突围与“贾子之路”重构
  • FDTD远场投影用不对?可能是这3个条件没满足(附案例图解与避坑指南)
  • 全球电缆线槽系统市场研究报告
  • 【Claude ROI计算模型】:20年AI商业化专家首度公开3大核心公式与5个避坑指南
  • 论文格式改到崩溃?okbiye 院校级模板库一键对齐毕业规范
  • 从实战出发:聊聊Serial口静态路由在老旧网络设备迁移中的那些事儿
  • 你以为 GPT-4 背后是深不可测的算法?其实核心代码不超过 20 行!
  • 用Python模拟退火算法解决TSP问题:从物理退火到代码实现的保姆级拆解
  • 大气层系统终极指南:5步解锁Switch隐藏功能与性能优化
  • 从激光雷达到PET扫描:拆解SiPM在不同应用场景下的电路设计“避坑”指南
  • Better ClearType Tuner:Windows 10字体渲染优化终极指南,告别模糊文字困扰
  • 不止于下载:用Charles抓包分析微信视频号的传输协议与缓存策略
  • 种粮大户私藏的AI Agent轻量部署包(仅适配国产ARM边缘设备),支持离线运行+方言语音交互——限前500名申领
  • Win11 24H2桌面窗口大改,动态壁纸插件开发者必看的底层变化与适配指南
  • 告别ST-Link!用CH347+OpenOCD给STM32烧录固件的保姆级教程(Linux/Windows双平台)
  • 2026年阿里云OpenClaw/Hermes Agent配置Token Plan部署保姆攻略
  • OpenClaw从入门到应用——自动化:对比Cron 与 Heartbeat
  • 2026年10款降AI率工具亲测:最高AI率100%直降至0.12%
  • 143k Star!一个文件让Claude Code和Cursor代码质量翻倍
  • 别再乱并电容了!手把手教你为继电器触点选对RC吸收电路(附参数计算与实测避坑)
  • 从原理到调参:深入理解OpenCV立体校正中R1, R2, P1, P2矩阵到底在做什么