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

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)...

【数据结构】逻辑结构与物理结构

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f333;逻辑结构 1.集合结构 2.线性结构 3.树形结构 4.图形结构或网状结构 &#x1f333;物理结构 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 并回车发生了什么

本文节选自我的博客&#xff1a;浏览器输入 URL 并回车发生了什么 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是MilesChen&#xff0c;偏前端的全栈开发者。&#x1f4dd; CSDN主页&#xff1a;爱吃糖的猫&#x1f525;&#x1f4e3; 我的博客&#xff1a;爱吃糖…...

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库&#xff0c;用于进行HTTP请求。它提供了一组简洁而强大的方法来发送各种类型的请求&#xff0c;并处理响应数据。以下是Axios中一些常用的方法及其格式&#xff1a; GET请求&#xff1a; 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&#xff0c;是甲骨文公司的一款关系…...

stable diffusion和gpt4-free快速运行

这是一个快速搭建环境并运行的教程 stable diffusion快速运行gpt快速运行 包含已经搭建好的环境和指令&#xff0c;代码等运行所需。安装好系统必备anaconda、conda即可运行。 stable diffusion快速运行 github: AUTOMATIC1111/稳定扩散网络UI&#xff1a;稳定扩散网页用户界…...

分享三个国内可用的免费GPT-AI网站

AIchatOS国内的不需要梯子 AItianhu同上 国内百度的文心一言一样非常优秀...

使用SDKMAN在Linux系统上安装JDK

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

MySQL(8) 优化、MySQL8、常用命令

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

前端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. 什么是双亲委派模型 提到 类加载 机制&#xff0c;不得不提的一个概念就是“双亲委派模型”。 双亲委派模型指的就是 JVM 中的类加载器如何根据类的全限定名找到 .class 文件的过程 类加载器: JVM 里面专门提供…...

多叉树+图实现简单业务流程

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

Word | 简单可操作的快捷公式编号、右对齐和引用方法

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

leetCode 123.买卖股票的最佳时机 III 动态规划 + 状态压缩

123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09; 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意&#xff1a;你不能同时参与多笔交易&#xff0…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...