Rust类型之字符串

字符串

Rust 中的字符串类型是String。虽然字符串只是比字符多了一个“串”字,但是在Rust中这两者的存储方式完全不一样,字符串不是字符的数组,String内部存储的是Unicode字符串的UTF8编码,而char直接存的是Unicode Scalar Value
Rust字符串对Unicode字符集有着良好的支持,可以看一下示例:

let hello = String::from("こんにちは");
let hello = String::from("Dobrý den");
let hello = String::from("Hello");
let hello = String::from("שָׁלוֹם");
let hello = String::from("नमस्ते");
let hello = String::from("안녕하세요");
let hello = String::from("你好");
let hello = String::from("Olá");
let hello = String::from("السلام عليكم");
let hello = String::from("Здравствуйте");
let hello = String::from("Hola");

Rust 中的String不能通过下标去访问。

let testString = String::from("天下");
let s = testString[0]; // 你可能想把“天”字取出来,但实际上这样是错误的

String存储的Unicode序列的UTF8编码,而UTF8编码是变长编码。上边即使能访问成功,也只能取出一个字符的 UTF8 编码的第一个字节,很可能是没有意义的。因此 Rust 直接对String禁止了这个索引操作。

字符串字面量中的转义

与 C 语言一样,Rust 中转义符号也是反斜杠\,可用来转义各种字符。

fn main() {// 将""号进行转义let byte_escape = "I'm saying \"Hello\"";println!("{}", byte_escape); //输出的内容为 I'm saying "Hello"// 分两行打印let byte_escape = "I'm saying \n 你好";println!("{}", byte_escape);//输出的内容是// I'm saying// 你好// Windows下的换行符let byte_escape = "I'm saying \r\n 你好";println!("{}", byte_escape);//输出的内容是// I'm saying// 你好// 打印出 \ 本身let byte_escape = "I'm saying \\ Ok";println!("{}", byte_escape);//输出的内容是  I'm saying \ Ok// 强行在字符串后面加个0,与C语言的字符串一致。let byte_escape = "I'm saying hello.\0";println!("{}", byte_escape);//输出的内容是 I'm saying hello.
}

在这里插入图片描述

Rust 还支持通过\x输入等值的 ASCII 字符,以及通过\u{}输入等值的 Unicode 字符。

fn main() {// 使用 \x 输入等值的ASCII字符(最高7位)let byte_escape = "I'm saying hello \x7f";println!("{}", byte_escape);// 使用 \u{} 输入等值的Unicode字符(最高24位)let byte_escape = "I'm saying hello \u{0065}"; // 0065表示的是十六进制 65,也是十进制 101println!("{}", byte_escape);
}

在这里插入图片描述

禁止转义的字符串字面量

我们要是想输出原始字面量,也就是不进行转义,使用 r""r#""#把字符串字面量套起来就行了。

fn main() {// 字符串字面量前面加r,表示不转义let test_str = r"test \x7f \u{0066}";println!("{}", test_str);// 这个字面量必须使用r##这种形式,因为我们希望在字符串字面量里面保留""let test_string = r#"He says: "Work hard and make progresses everyday""#;println!("{}", test_string );// 如果遇到字面量里面有#号的情况,可以在r后面,加任意多的前后配对的#号,// 只要能帮助Rust编译器识别就行let test_string1 = r###"A string has "# in it. And even "##!"###;println!("{}", test_string1);
}

在这里插入图片描述

字节串

很多时候,我们只需要 ASCII 字符集,字符串字面量中用不到Unicode字符。对于这种问题,Rust 还有一种更紧凑的表示法:字节串。用b开头,双引号括起来,比如b"this is a byte string"。这时候字符串的类型已不是字符串,而是字节的数组 [u8; N]N为字节数。示例代码如下:

fn main() {// 字节串的类型是字节的数组,而不是字符串了let bytestring: &[u8; 21] = b"this is a byte string";println!("A byte string: {:?}", bytestring);// 可以看看下面这串打印出什么let escaped = b"\x52\x75\x73\x74 as bytes";println!("Some escaped bytes: {:?}", escaped);// 字节串与原始字面量结合使用let raw_bytestring = br"\u{211D} is not escaped here";println!("{:?}", raw_bytestring);
}

在这里插入图片描述

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

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

相关文章

纯前端 —— 200行JS代码、实现导出Excel、支持DIY样式,纵横合并

前期回顾 Vue3 TS Element-Plus 封装Tree组件 《亲测可用》_vue3ts 组件封装-CSDN博客https://blog.csdn.net/m0_57904695/article/details/131664157?spm1001.2014.3001.5501 目录 具体思路: 1. 准备HTML结构 2. 定义CSS样式 3. 初始化表格数据 4. 创建表…

QT第四天

头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTime>//时间类 #include<QTimerEvent>//定时器事件类 #include<QtTextToSpeech> //语言播报类 #include<QPushButton> namespace Ui { class Widget; }clas…

NOIP2017 提高组 奶酪(DFS、BFS、并查集)一题三解

原文链接&#xff1a;NOIP真题第三讲&#xff1a;奶酪 题目来源&#xff1a;2017 年 NOIP 提高组 第一题 本题考察点&#xff1a;【DFS、BFS、并查集】 一、题目及链接 题目链接&#xff1a; https://www.luogu.com.cn/problem/P3958 题意&#xff1a;老鼠是否可以从下表面…

确定了!软考中级「集成」、「监理」新版教程有哪些变化?

新版教程改了哪些内容&#xff1f;2024上半年软考应该如何备考&#xff1f; 准备考24年上集成的朋友们&#xff0c;先不要慌&#xff01;备考脚步不要乱&#xff0c;改版可能还是好事呢&#xff0c;难度可能会降点&#xff1f; 2024年教程改版科目&#xff1a; ✔软考中级-集…

【rk3568】01-环境搭建

文章目录 1.开发板介绍1.1相关资源&#xff1a;1.2接口布局1.3屏幕1.4核心板引脚可复用资源 2.环境搭建2.1安装依赖包2.2git配置2.3安装sdk2.4sdk介绍2.5sdk编译 3.镜像介绍 1.开发板介绍 开发板&#xff1a;atk-rk3568开发板 eMMC&#xff1a;64G LPDDR4&#xff1a;4G 显示屏…

Windows 10 Manager v3.9.0.0

软件介绍 Windows 10 Manager&#xff0c;Win10优化软件&#xff0c;香港Yamicsoft 公司开发的集微软Windows10的所有功能于一身的系统优化软件&#xff0c;包含40多个实用程序来优化&#xff0c;调整&#xff0c;清理&#xff0c;加速和修复Windows 10&#xff0c;可以让系统…

20240111在ubuntu20.04.6下解压缩RAR格式的压缩包

20240111在ubuntu20.04.6下解压缩RAR格式的压缩包 2024/1/11 18:25 百度搜搜&#xff1a;ubuntu rar文件怎么解压 rootrootrootroot-X99-Turbo:~/temp$ ll total 2916 drwx------ 3 rootroot rootroot 4096 1月 11 18:28 ./ drwxr-xr-x 25 rootroot rootroot 4096 1月…

DLT:dlt-daemon示例解析2

DLT&#xff1a;dlt-daemon示例解析 回顾一下上期第一个示例打印DLT日志的流程。 这次来分析第二个示例。 目录dlt-daemon/examples/example2/下有以下文件 CMakeLists.txt dlt_id.h example2.c example2.xml 其中example2.xml编译用不到&#xff0c;里面描述了一些程序的…

ssm框架的简单整合!!!(配置环境)

项目结构&#xff1a; pom.xml: <packaging>war</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</proj…

24/01/11 qt work

1. 作业&#xff1a; xx.h 文件#ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include <QDate> #include <QTime> #include <QTimerEvent> #include <QMessageBox> #include <QDebug> #include <QTextToSpeech>QT_BEGI…

【C++】C++11中的常见语法(上)

C11 一、C11简介二、统一的列表初始化1.&#xff5b;&#xff5d;初始化2. std::initializer_list 三、声明1. auto2. decltype3. nullptr 四、右值引用和移动语义1. 左值引用和右值引用2. 左值引用与右值引用比较3. 右值引用使用场景和意义4. 右值引用引用左值及其一些更深入的…

FineBI实战项目一(16):下订单总用户数分析开发

点击新建组件&#xff0c;创建下订单总用户数组件。 选择自定义图表&#xff0c;选择文本&#xff0c;拖拽要分析的字段到文本中。 修改指针值名称。 将指针值名称修改为用户数。 进入仪表板&#xff0c;拖拽刚刚的组件进入仪表板&#xff0c;然后在再编辑标题。 效果如下&…