rust学习-string
介绍
A UTF-8–encoded, growable string(可增长字符串).
拥有string内容的所有权
A String is made up of three components: a pointer to some bytes, a length, and a capacity.
The length is the number of bytes currently stored in the buffer
pub fn as_bytes(&self) -> &[u8]
字符串的内容转为byte slice
fn main() {let s = String::from("我的世界123abc");print!("{:?}\n", s.as_bytes());
}
pub fn as_str(&self) -> &str
将 String 转换为一个不可变引用 &str
fn main() {let s = String::from("hello");let s_ref: &str = s.as_str();println!("{}", s_ref);
}
在上述示例中,定义一个字符串 s,然后使用 as_str() 方法将其转换为一个不可变引用 &str
注意
as_str() 方法返回的是对原始 String 中的数据的引用,并不会对字符串的所有权进行转移。
这意味着在转换后,原始的 String 对象仍然可以使用。
但是,要保证转换后的 &str 引用在原始 String 存在时有效,以防止访问无效的数据。
(这个名字起的真好,as,作为,他既是一个老师,也是一个舞蹈家)
pub fn into_boxed_str(self) -> Box<str, Global>
将 String 转换为 Box<str, Global> 类型。Box<str, Global> 是一个堆分配的 str 的智能指针。
fn main() {let s = String::from("hello");let boxed_str: Box<str> = s.into_boxed_str();println!("{}", boxed_str);
}
通过将 String 转换为 Box,将字符串的所有权转移到了堆上的一个固定大小的箱子(box)中。
注意,该转换可能会涉及堆分配的内存,因此请确保进行必要的内存管理和清理。
pub fn into_bytes(self) -> Vec<u8, Global>
String -> byte vector
会消耗字符串,因此不需要复制内
fn main() {// move occurs because `s` has type `String`, which does not implement the `Copy` traitlet s = String::from("hello");// `s` moved due to this method calllet bytes = s.into_bytes();assert_eq!(&[104, 101, 108, 108, 111][..], &bytes[..]);// 编译失败,value borrowed here after moveprint!("{}", s);
}
pub fn into_raw_parts(self) -> (*mut u8, usize, usize)
a nightly-only experimental API
将字符串分解为其原始组件,String -> raw components
返回指向基础数据的原始指针、字符串的长度(以字节为单位)以及数据的分配容量(以字节为单位)。
Returns the raw pointer to the underlying data, the length of the string (in bytes), and the allocated capacity of the data (in bytes)
这些参数与 from_raw_parts 的参数的顺序相同。
调用此函数后,调用者负责之前由 String 管理的内存。
执行此操作的唯一方法是使用 from_raw_parts 函数将原始指针、长度和容量转换回字符串,从而允许析构函数执行清理。
Decomposes a String into its raw components.
#![feature(vec_into_raw_parts)]
let s = String::from("hello");let (ptr, len, cap) = s.into_raw_parts();let rebuilt = unsafe { String::from_raw_parts(ptr, len, cap) };
assert_eq!(rebuilt, "hello");
pub fn len(&self) -> usize
返回此字符串的长度(以字节为单位),而不是字符或字素(not chars or graphemes)。
换句话说,它可能不是人类所认为的字符串长度。
let a = String::from("foo");
assert_eq!(a.len(), 3);let fancy_f = String::from("ƒoo");
assert_eq!(fancy_f.len(), 4);
assert_eq!(fancy_f.chars().count(), 3);
pub fn from_utf8(vec: Vec<u8, Global>) -> Result<String, FromUtf8Error>
A string (String) is made of bytes (u8)
A vector of bytes (Vec) is made of bytes
Converts a vector of bytes to a String.
如果确定byte slice是有效的 UTF-8,并且不想承担有效性检查的开销
则该函数有一个不安全版本 from_utf8_unchecked,它具有相同的行为但跳过检查。
- 该方法的逆方法是 into_bytes
- 为了提高效率,from_utf8方法不复制向量。
- 如果需要 &str 而不是 String,请考虑 str::from_utf8。
错误
如果切片不是 UTF-8,则返回 Err,并说明为什么提供的字节不是 UTF-8
注意:
String requires that it is valid UTF-8. from_utf8() checks to ensure that the bytes are valid UTF-8
And then does the conversion.
pub fn from_utf8_lossy(v: &[u8]) -> Cow<'_, str>
它接受一个 &[u8] 类型的字节数组 v,并尝试将其解析为一个 str 类型
内部使用了 Cow(Clone on Write)类型来处理不同的情况
fn main() {let bytes = b"Hello, \xF0\x9F\x8C\x8E";let s = String::from_utf8_lossy(bytes);println!("{}", s); // Hello, 🌎
}
有一个字节数组 bytes,其中包含一些 Unicode 字符。将该字节数组传递给 from_utf8_lossy
当字节数组包含有效的 UTF-8 字符时,from_utf8_lossy 函数会解析它们并返回一个具有借用/拥有(Owned)字符串的 Cow::Borrowed 或 Cow::Owned。它们是 Cow 类型的两个变体,允许在需要时选择最合适的字符串表示。
在处理非 UTF-8 数据时,from_utf8_lossy 函数会用 U+FFFD REPLACEMENT CHARACTER 替换不合法的 UTF-8 序列,并返回一个包含替代字符的字符串。
from_utf8_lossy 并不是一个严格的 UTF-8 解析器,它在不符合规范的情况下会进行一些补救措施
如果需要更严格的 UTF-8 解析,可以使用 std::str::from_utf8 函数
大小和索引问题
fn main() {use std::mem;// `s` is ASCII which represents each `char` as one bytelet s = "hello";assert_eq!(s.len(),
相关文章:
rust学习-string
介绍 A UTF-8–encoded, growable string(可增长字符串). 拥有string内容的所有权 A String is made up of three components: a pointer to some bytes, a length, and a capacity. The length is the number of bytes currently stored in the buffer pub fn as_bytes(&…...

No167.精选前端面试题,享受每天的挑战和学习
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...

【python】pycharm导入anaconda环境
参考 Pycharm导入anaconda环境的教程图解 - 知乎 (zhihu.com)...

【数据结构】逻辑结构与物理结构
🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 🌳逻辑结构 1.集合结构 2.线性结构 3.树形结构 4.图形结构或网状结构 🌳物理结构 1.顺序存储结构 2.链式存储结构 结语 根据视点的不同,我…...
HTML5高级部分
目录 一、拖拽API1.1 拖拽元素1.2 监听事件1.3 dataTransfer传递数据 二、媒体API2.1 常用监听事件2.2 常用API 三、画布API3.1 canvas 标签3.2 创建canvas对象3.3 常用API 四、地理API4.1 方法 一、拖拽API 1.1 拖拽元素 页面中设置了draggable"true"的元素可以进…...

浏览器输入 URL 并回车发生了什么
本文节选自我的博客:浏览器输入 URL 并回车发生了什么 💖 作者简介:大家好,我是MilesChen,偏前端的全栈开发者。📝 CSDN主页:爱吃糖的猫🔥📣 我的博客:爱吃糖…...

asp.net core mvc 文件上传,下载,预览
//文件上传用到了IformFile接口 1.1文件上传视图 <form action"/stu/upload" method"post" enctype"multipart/form-data"><input type"file" name"img" /><input type"submit" value"上传&…...
Axios有哪些常用的方法?
Axios是一个常用的JavaScript库,用于进行HTTP请求。它提供了一组简洁而强大的方法来发送各种类型的请求,并处理响应数据。以下是Axios中一些常用的方法及其格式: GET请求: axios.get(url[, config]).then(response > {// 请求…...

PL/SQL+cpolar公网访问内网Oracle数据库
文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle,是甲骨文公司的一款关系…...

stable diffusion和gpt4-free快速运行
这是一个快速搭建环境并运行的教程 stable diffusion快速运行gpt快速运行 包含已经搭建好的环境和指令,代码等运行所需。安装好系统必备anaconda、conda即可运行。 stable diffusion快速运行 github: AUTOMATIC1111/稳定扩散网络UI:稳定扩散网页用户界…...
分享三个国内可用的免费GPT-AI网站
AIchatOS国内的不需要梯子 AItianhu同上 国内百度的文心一言一样非常优秀...

使用SDKMAN在Linux系统上安装JDK
本文使用的Linux发行版为Rocky Linux 9.2,可以当做CentOS的平替产品。 SDKMAN是一个sdk包管理工具,通过自带的命令可以快速切换软件环境, 官网地址:https://sdkman.io/。 1、安装sdkman: # curl -s "https://ge…...

MySQL(8) 优化、MySQL8、常用命令
一、MySQL优化 从上图可以看出SQL及索引的优化效果是最好的,而且成本最低,所以工作中我们要在这块花更多时间。 服务端参数配置; max_connections3000 连接的创建和销毁都需要系统资源,比如内存、文件句柄,业务说的支持…...

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(三)
思维导图 全选案例 大按钮控制小按钮 小按钮控制大按钮 css伪类选择器checked <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><…...
嵌入式汇编大合集
嵌入式汇编 内联汇编的基本格式: asm volatile( /* volatile : 可选,禁止编译器对汇编代码进行优化 */"汇编指令" /* 汇编指令间使用\n分隔 */:"=限制符"(输出参数):"限制符"(输入参数):保留列表 )共四个部分:汇编语句,输出部分,输入部分…...
C#WPF框架MvvMLight应用实例
本文实例演示C#WPF框架MvvMLight应用实例。 目录 一、MVVM概述 二、MVVMLight概述 三、使用MVMLight框架 一、MVVM概述 MVVM概述MVVM是Model-View-ViewModel的简写,主要目的是为了解耦视图(View)和模型(Model)。...

【JVM】双亲委派模型
双亲委派模型 1. 什么是双亲委派模型2. 双亲委派模型的优点 1. 什么是双亲委派模型 提到 类加载 机制,不得不提的一个概念就是“双亲委派模型”。 双亲委派模型指的就是 JVM 中的类加载器如何根据类的全限定名找到 .class 文件的过程 类加载器: JVM 里面专门提供…...

多叉树+图实现简单业务流程
文章目录 场景整体架构流程业务界面技术细节小结 场景 这次遇到一个需求,大致就是任务组织成方案,方案组织成预案,预案可裁剪调整.预案关联事件等级配置,告警触发预案产生事件.然后任务执行是有先后的,也就是有流程概念. 整体架构流程 方案管理、预案管理构成任务流程的基础条…...

Word | 简单可操作的快捷公式编号、右对齐和引用方法
1. 问题描述 在理工科论文的写作中,涉及到大量的公式输入,我们希望能够按照章节为公式进行编号,并且实现公式居中,编号右对齐的效果。网上有各种各样的方法来实现,操作繁琐和简单的混在一起,让没有接触过公…...

leetCode 123.买卖股票的最佳时机 III 动态规划 + 状态压缩
123. 买卖股票的最佳时机 III - 力扣(LeetCode) 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易࿰…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...