16_rust的字符串

news/发布时间2024/8/24 23:08:54

rust的字符串

字符串简介

字符串:UTF-8格式,byte的集合,提供了一些解析byte为文本的方法。
rust的核心语言层面,只有一个字符串类型:字符串切片str(或&str)
字符串切片:对存储在其他地方、UTF-8编码的字符串的引用
其中字符串字面值,存储在二进制文件中,也是字符串切片。

String类型

  • 来自标准库,而不是核心语言。
  • 可增长、可修改、可拥有。
  • 也是UTF-8编码。

通常说的字符串是指:String和&str两种类型。他们都在标准库里非常常用,都是UTF-8编码。

其它类型的字符串

  • rust的标准库还包括很多其它字符串类型,如OsString、OsStr、CString、Cstr。
  • String后缀的通常拥有所有权,以Str后缀通常表示借用的变体。
  • 也提供了可存储不同编码的文本或在内存中以不同形式展现的库。

Library crate针对存储字符串可提供更多的选项。

创建字符串(String)

String是byte的集合,所以很多Vec<T>的操作都可用于String。

  • String::new()函数创建空的String类型。
let mut s = String::new();
  • 使用初始值创建String,
    • to_string方法可用于Display trait的类型,包括字符串字面值。
    • String::from()函数,从字面值创建String。
let data = "test";
let s = data.to_string();
let s1 = "test".to_string();
let s2 = String::from("test");

因为是UTF-8编码,可以存储多种语言。

更新String

  • push_str方法:把一个字符串切片附加到String。
let mut s = String::from("test ");
s.push_str("func"); // 参数是&Str类型,获得字符串切片,无需获得所有权
let s1 = String::from("func");
s.push_str(&s1);
  • push()方法:把单个字符附加到String。
let mut s = String::from("test ");
s.push("t");
  • +号连接字符串(拼接),使用了类似签名方法fn add(self, s:&Str)->String{...};标准库中的add方法使用了泛型,只能把&str添加到String,解引用强制转换(deref coercion)。
let s1 = String::from("s1 +");
let s2 = String::from(" s2");
let s3 = s1 + &s2; // 第一个s1转移所有权,第二个得是引用(字符串切片),不获得所有权
// 相加的过程,相当于调用add函数,首先获得第一个参数s1的所有权,然后添加s2的切片内容,再把所有权转移给s3
println!("{}", s3);
println!("{}", s1);// 因为在相加的时候失去了所有权,所以编译报错
println!("{}", s2);
  • format!宏连接多个字符串,样式与println!类似,输出目的地不同。不会获取参数的所有权。
let s1 = String::from("s1");
let s2 = String::from("s2");
let s3 = String::from("s3");
let s4 = s1 + "-" + &s2 + "-" + &s3;
let s5 = format!("{}-{}-{}", s1, s2, s3); // 不会获取参数的所有权,这些参数在后续依然可使用

访问String

对String按索引的形式进行访问:按索引语法访问String某部分会报错。rust的字符串不支持索引语法访问。

let s1 = String::from("s1test");
let c = s1[2]; // 编译报错

内部表示

String是对Vec<u8>的包装,.len()方法可返回string所占的字节数。

let len = Stirng::from("test").len(); // 这里len=4
let len = Stirng::from("你好").len(); // 这里也是len=4
// 因为是UTF-8编码,每个字符单元是一个Unicode 标量值(占用两个字节)
// 如果使用索引去访问,比如
let s1 = "你好";
let c = s1[1];
// 因为一个字占两个字节,如果按照索引访问s[1],显然获得值是没有意义的,并不代表一个字。

为了防止上述索引访问引起的歧义和错误,rust语言直接禁止这种访问方式,防止运行未知错误。

字节、标量值、字形簇

Bytes、Scalar Values、Grapheme Clusters
rust有三种看待字符串的方式:字节bytes、标量值、字形簇(最接近所谓的“字母”)。

let s1 = "test";
for b in s1.bytes() {println!("{}", b);
}
for b in s1.chars() { //chars对应unicode标量值println!("{}", b);
}

rust不允许对String进行索引的最后一个原因:索引操作消耗一个常量时间O(1),但String无法保证,需要遍历所有内容来确定有多少个合法的字符。

切割String

可用[]和一个范围来创建字符串的切片。必须谨慎使用,因切割是必须按照Unicode标量值的整数倍切割(2*n),如果切割时跨越了字符边界,程序会panic。

let s1 = "你好";
let s = &s1[0...1];
let s = &s1[0...3]; // 编译报错

遍历String的方法

对于标量值:chars()方法遍历
对于字节:bytes()方法遍历
对于字形簇:很复杂,标准库未提供方法,需要借助第三方库。

UTF-8编码的好处是可防止开发后期处理非ASCII字符的错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.liansuoyi.cn/news/55126502.html

如若内容造成侵权/违法违规/事实不符,请联系连锁易网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

【专题】2022年中国跨境电商行业研究报告PDF合集分享(附原数据表)

报告链接:http://tecdat.cn/?p=32044 近年来,我国的跨境电子商务发展迅速,在过去五年中,其贸易额增长率达到了16.2%,已经成为稳定对外贸易的一支重要力量。 阅读原文,获取专题报告合集全文,解锁文末52份跨境电商行业相关报告。 一方面,随着跨境电子商务的发展,跨境电…

猜你喜欢:银行面试相关

本文首发自公粽hao「林行学长」,欢迎来撩,免费领取20个求职工具资源包。 了解校招、分享校招知识的学长来了! 前段时间银行招聘大家不知道报名没有? 最近的流程已经慢慢走到笔试面试了,相信报名的同学很有参与感~相信有的同学可能在苦恼笔试面试的问题,毕竟银行可能和企业…

mysql 备份文件.xbstream 恢复

数据库备份文件的恢复 1. 可通过xtrabackup工具恢复,官方下载地址:https://www.percona.com/downloads/XtraBackup/LATEST/ 选择对应版本安装注意:要选择和数据库版本对应的工具 2. 全量恢复 #全备文件:full_backup.xbstream #恢复mysql数据文件目录:/rds/mysql# 恢复全备…

Telegram 正式引入国产小程序技术

Telegram 宣布为其开发者提供了一项“能够在 App 中运行迷你应用”的新功能( 迷你应用即 Mini App,下文中以“小程序”代替)。Telegram 宣布为其开发者提供了一项“能够在 App 中运行迷你应用”的新功能( 迷你应用即 Mini App,下文中以“小程序”代替)。 在一篇博客文章中…

我院五名学子获第四届“火焰杯”软件测试开发选拔赛全国奖项

第四届“火焰杯”软件测试开发选拔赛于 9 月 20 日在精工园 1 号楼隆重举行,测吧(北京)科技有限公司的项目总监王雪冬莅临我院,为获奖学生颁发奖项。本届比赛吸引了全国 28 个省份的 158 所高校的 3221 名学生踊跃参赛。我院软件工程系的 2020 级学生,包括谢奇江、林颂扬、…

ADC按键电路实现

来源:https://www.cnblogs.com/liaigu/p/17784909.html 在程序设计以及硬件电路设计中,通常使用GPIO连接按键,通过检测外部按键按下的高低电平实现按键的检测。当我们需要多个按键且GPIO资源不够的时候,我们可以利用MCU的ADC功能,实现对按键的检测。 ADC按键检测电路如下:…

工具分享:一款可以兼容微信支付宝多个小程序的兼容工具

antmove 的初衷是提供一种小程序跨平台开发的解决方案,帮助开发者底层本实现小程序的跨平台开发(微信小程序、支付宝小程序、百度智能小程序、头条小程序),做到一套代码开发、多小程序平台运行的目的。 目前 antmove 已经帮助了多款微信小程序到支付宝小程序的迁徙,代码转…

docker安装ES8.8.1

1、用docker拉取ES 8.8.1的镜像docker pull docker.elastic.co/elasticsearch/elasticsearch:8.8.1 2、添加docker网络 docker network create elastic 3、创建挂载目录,红色部分根据当前实际环境更改目录 mkdir -p /usr/local/es/{config,data,logs,plugins} mkdir -p /u…

浅谈go反射

基本概念 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。 Go语言提供了 reflect 包来访问程序的反射信息。 Refelc…

Pset_SpaceOccupancyRequirements

Pset_SpaceOccupancyRequirements 空间占用要求:与在一个或一组类似的空间结构元素内发生或预计发生的工作活动有关的属性。NameTypeDescriptionOccupancyType P_SINGLEVALUE / IfcLabelNutzungsart Nutzungsart des Raums gem der gltigen Raumnutzungstabelle des Raumprogr…

Debian初体验之基础设置

layout: 0模版 title: Debian初体验之基础设置 date: 2023-10-17 19:18:56 tags: [debian, 软路由, aircrack-ng] categories: Debian学习J4125软路由里面的Debian 11,包含Debian连接NAS的远程目录 尝试debian启动桌面,安装VNC远程控制,运行aircrack-ng跑包等等...Debian远程…

JavaWeb开发-HTML基础学习

1.HTML的基本语法HTML是什么?:HTML是一种超文本标记语言,负责网页的结构,设计页面的元素内容等超文本:超越文本限制,除了文本信息,还可以定义图片,音频,视频等 标记语言:由标签构成的语言。HTML代码直接在浏览器中运行,由浏览器解析(1)HTML标签的特点不区分大小写…

springcloud-gateWay

基础模板 spring:cloud:gateway:routes:-id: gulimall-search # 别重复就行uri: lb://gulimall-search #对应微服务的applicationNamepredicates:- Path=/api/search/**predicates的概念 每一个route对应一个--->RouteDefinition 而route对应的predicates对应---->RouteD…

【不限框架】超好用的3d开源图片预览插件推荐

今天给大家推荐一款超好用的图片预览插件-image-preview简单说明 image-preview是一款主要面向移动端web应用,同时兼容pc,基于原生js,不限框架,react,vue,angular都可以使用,使用webgl作为渲染界面,提供高性能,优质体验的图片预览插件。 图片浏览大图时提供了细腻的交互…

laravel:多mysql数据库(10.27.0)

一,相关文档 https://learnku.com/docs/laravel/10.x/database/14882#2cd405 二,php代码 1,编辑.env DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=gonews DB_USERNAME=yourusername DB_PASSWORD=yourpasswordCO_DB_CONNECTION=mysql CO_DB_HOST=127.0.…

样条函数,图形渲染与光照处理示例

样条函数,图形渲染与光照处理示例图1:图形学在各个行业中的应用 视图模型变换图形学中最基本的概念是图形对象的表示,简要介绍了这些概念,主要包括: 颜色表示:常见的颜色空间,包括RGB,CMY,HSV,CIE XYZ等。 光照模型:Phong光照模型 绘制:网格的绘制 变换:几种常见的…

CSS必学:你需要知道的盒子模型的秘密

作者:WangMin 格言:努力做好自己喜欢的每一件事作为前端开发来说,要掌握的CSS基础一定很多,那么CSS中盒子模型肯定是必考必问必掌握的前端知识点,因为它是CSS基础中非常重要的内容,接下来我们就一起来了解一下盒子模型吧!什么是盒子模型? CSS 所有的HTML 标签元素在网页中…

安装银河麒麟部署达梦数据库

安装银河麒麟部署达梦数据库 一、安装银河麒麟系统V10 1.1 配置虚拟机参数,并启动虚拟机1.2 选择:Install Kylin Linux Aduanced Seruer U101.3 直接下一步1.4 安装目的地:选择自动分区、语言支持:简体中文、软件选择:带UKUI GUI的服务器、设置root密码、开始安装1.5 重启…

1024 程序员节,圆一个小小的梦

Hope is a good thing, maybe the best of things, and no good thing ever dies. 希望是件美丽的东西,也许是最好的东西,而美好的东西是永远不会消逝的。大家好,我是勇哥 。 1024 , 程序员节,圆了我一个小小的梦。 花了半年时间,我写了一本电子书 ,书名是:《RocketMQ4.…

VP记录

前期手感不错 观察榜单后放了一会儿F 再来看 一下就过了 5题 270罚时 做到了前期不崩 后面发现H D过的比较多 赛前就知道了 所以没有浪费时间去看这两题 但是吃了一会饭 我们就当吃饭的时候是去看这两题了 并且都是在30分钟 无果 并且放弃的 后面B题 因为没看到 立即退出卡了很…
推荐文章