返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Rust字符串字面值的一些经验总结
  • 668
分享到

Rust字符串字面值的一些经验总结

2024-04-02 19:04:59 668人浏览 独家记忆
摘要

目录前言字符串字面值(String literals)Byte string literals总结前言 Rust 中有两种字符串,String 和 &str,其中 Strin

前言

Rust 中有两种字符串,String 和 &str,其中 String 可动态分配、修改,内部实现可以理解为 Vec<u8>,而 &str 是一个类型为 &[u8] 的切片。这两种字符串都只能保存合法的 UTF-8 字符。

而对于非肉眼可辨识的 UTF-8 字符,则可以考虑使用如下类型:

  • 文件路径有专用的 Path 和 PathBuf 类可用。
  • 使用 Vec<u8> 和 &[u8]
  • 使用 OSString 和 &OSStr 和操作系统交互
  • 使用 CString 和 &CStr 和 C 库交互

上面的第二种方法,就是常用的处理非 UTF-8 字节流的方式,也就是使用 Vec<u8> 和 &[u8] ,其中我们也可以使用字面值来处理这两种类型的数据,我们称之为字节字符串字面值(byte string literals),其类型为 &[u8]。

字符串字面值(String literals)

先来看一下字符串字面值。

和其他语言一样,用双引号括起来就是一个字符串,不过 Rust 的一个特点是字符串可以跨行,即中间有回车也不会引起编译或运行错误,在输出的时候也会带着里面的换行符。

同样,字符串字面值里面支持转义,比如想在里面使用双引号,该转义也会对换行符进行转义,比如下面这样,在换行符前面使用 \ ,则该转义符、换行符以及下一行开头的所有空格都将会被忽略:

let a = "foobar";
let b = "foo\
         bar";
assert_eq!(a,b);

字符串字面值除了支持常见的 \ 对字节(字符)进行转义,还支持对 Unicode 进行转义:

  • \xHH: + 2位的十六进制7位宽度字节码,这相当于等值的 ASCII 字符。
  • \u{xxxx}:24位长的16进制,表示等值的 Unicode 字符。
  • \n/\r/\t 表示 U+000A (LF), U+000D (CR) 和 U+0009 (HT)
  • \\ 用来对 \ 本身进行转义
  • \0 表示 Unicode U+0000 (NUL)

Raw 类型的字符串字面值表示进行转义,也就是说字面值写的是什么内容,字符串的值就是什么。这种类型的字面值使用 r 以及若干 # 开头进行定义,结尾需要相等数量的 #。

如下所示:

"foo"; r"foo";                     // foo
"\"foo\""; r#""foo""#;             // "foo"

"foo #\"# bar";
r##"foo #"# bar"##;                // foo #"# bar

"\x52"; "R"; r"R";                 // R
"\\x52"; r"\x52";                  // \x52

如果字符串中有双引号怎么办?因为 raw string 里不能使用转义,所以 \" 是肯定不行的。Rust 实际支持使用 r# 的方式来指定字符串边界。这个 # 就是转义的另一种实现方式,比如字符串里面有 4 个 #,那么该字符串可以用 r#####"abC####def"##### 来包围起来,也就是比里面的 # 多即可。

Byte string literals

Byte string 字面值使用 b"..." 以及衍生语法定义,其类型为 &[u8],这个和 &str 是完全不一样的类型,所以有些在 &str 上能用的方法,在 &[u8] 上是用不了的。

比如:

// &[u8; 5]: [119, 111, 114, 108, 100]!
let world = b"world";
println!("Hello, {}!", world);

编译会报错,因为 &[u8] 没有实现 std::fmt::Display:

29 |     println!("Hello, {}!", world);
   |                            ^^^^^ `[u8; 5]` cannot be fORMatted with the default formatter
   |

   = help: the trait `std::fmt::Display` is not implemented for `[u8; 5]`
   = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
   = note: this error originates in the Macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)

Byte string 字面值也支持转义,但是需要注意它只支持字节转义,不支持 Unicode 转义。

// 支持字符转义,输出:Hello, Rust!
let escaped = b"\x52\x75\x73\x74 as bytes";

// 不支持 Unicode 转义,编译错误:
// = help: unicode escape sequences cannot be used as a byte or in a byte string
let escaped = b"\u{211D} is not allowed";
// Raw byte strings work just like raw strings
let raw_bytestring = br"\u{211D} is not escaped here";
println!("{:?}", raw_bytestring);

// Converting a byte array to `str` can fail
if let Ok(my_str) = str::from_utf8(raw_bytestring) {
    println!("And the same as text: '{}'", my_str);
}

字节字符串也支持 raw 定义,和标准字符串类型类似,使用 r 前缀定义 raw byte string 字面值变量。

例如下面的例子中普通的字节字符串需要转义,raw 字节字符串就不需要使用 \ 进行转义了。

b"foo"; br"foo";                     // foo
b"\"foo\""; br#""foo""#;             // "foo"

b"foo #\"# bar";
br##"foo #"# bar"##;                 // foo #"# bar

b"\x52"; b"R"; br"R";                // R
b"\\x52"; br"\x52";                  // \x52

总结

下面是刚才介绍的这几种字符串字面值定义的一个总结,列出了不同的定义方式和其含义。

符合    意义
“…”    字符串字面值
r"…“, r#”…“#, r##”…“##, etc.    Raw 字符串字面值,禁止转义
b"…“    字节字符串字面值,类型为 &[u8]
br"…“, br#”…“#, br##”…“##, etc.    Raw 字节字符串字面值
‘…’    字符字面值
b'…‘    ASCII字节字面值

参考资料

  • Rust reference: Character and string literals
  • Rust By Example: Strings
  • TRPL: Non-operator Symbols

到此这篇关于Rust字符串字面值的文章就介绍到这了,更多相关Rust字符串字面值内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Rust字符串字面值的一些经验总结

本文链接: https://lsjlt.com/news/144943.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Rust字符串字面值的一些经验总结
    目录前言字符串字面值(String literals)Byte string literals总结前言 Rust 中有两种字符串,String 和 &str,其中 Strin...
    99+
    2024-04-02
  • Rust字符串字面值实例分析
    这篇文章主要讲解了“Rust字符串字面值实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Rust字符串字面值实例分析”吧!前言Rust 中有两种字符串,String 和 &st...
    99+
    2023-06-29
  • Python字符串的用法总结
    本篇内容介绍了“Python字符串的用法总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!创建字符串很简单,只要为变量分配一个值即可。例如:...
    99+
    2023-06-04
  • ES6字符串和数值新增方法总结
    目录字符串新增方法模板字符串字符串对象新增方法数值新增方法Math数值新增方法总结主要讲解了ES6中字符串与数值新增的常见的主要方法, 对其做了如下总结: 字符串新增方法 ES6对字...
    99+
    2024-04-02
  • Java中字符串常见的一些拼接方式总结
    目录方式一:+ 最常见的方式方式二:StringBuilder.append()和StringBuffer.append()方式三:String类下的cocat()方法方式四:Str...
    99+
    2023-05-14
    java字符串拼接的几种方式 JAVA字符串拼接 java字符串拼接的方法
  • 总结一些将字符串转为HTML代码的方法
    随着互联网的普及,网页的制作成为了一项重要的技能。而在网页设计的过程中,HTML是一种必不可少的语言。因此,学会将字符串转换为HTML代码也是非常必要的一项技能。在此介绍一些将字符串转换为HTML代码的方法。使用HTML标签使用HTML标签...
    99+
    2023-05-14
  • c字符串,string对象,字符串字面值的区别详解
    一、字符串字面值字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。字符串没有...
    99+
    2022-11-15
    string 字符串
  • python中字符串的常见操作总结(一)
    目录前言python中的对象什么是对象?字符串的capitalize()函数capitalize()的功能capitalize()的用法字符串的小写内置函数字符串的upper()函数...
    99+
    2024-04-02
  • mysql5.7字符集的一些问题总结
    本文主要给大家简单讲讲mysql5.7字符集的一些问题,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql5.7字符集的一些问题这篇文章可以给大家带来一...
    99+
    2024-04-02
  • Golang字符串结尾字符验证的实现方式
    标题:Golang字符串结尾字符验证的实现方式 在Golang中,我们经常需要对字符串进行各种操作和验证,其中之一就是验证字符串是否以特定字符结尾。在本文中,我们将介绍如何使用Gola...
    99+
    2024-03-12
    验证 字符串 golang
  • Golang校验字符串是否JSON格式的方法总结
    目录json.Validjson.Valid方法源码使用一个示例来看检测过程json-validator-go开发json-validator-go工具原因json-validato...
    99+
    2023-05-18
    Golang校验字符串是否JSON格式 Golang校验字符串 Golang 字符串 JSON格式
  • php如何验证字符串第一个字符是不是指定值
    这篇文章主要介绍了php如何验证字符串第一个字符是不是指定值的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php如何验证字符串第一个字符是不是指定值文章都会有所收获,下面我们一起来看看吧。3种方法:1、用“st...
    99+
    2023-06-30
  • PHP返回字符串第一个字符的?ASCII?值
    这篇文章将为大家详细讲解有关PHP返回字符串第一个字符的 ASCII 值,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 返回字符串第一个字符的 ASCII 值 引言 在 PHP 中,获取字符串第一个...
    99+
    2024-04-02
  • python常用字符串操作的总结
    本篇内容主要讲解“python常用字符串操作的总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python常用字符串操作的总结”吧!1、字符串使用乘法运算符*做乘法运算的含义是复制。>&...
    99+
    2023-06-20
  • Python字符串的基本用法总结
        字符串序列用于表示和存储文本,python中字符串是不可变对象。通常由单引号(' ),双引号(" ),三引号(''' """)包围,其中三引号可以由多行组成,编写多行文本的快捷语法,常用语文档字符串,在文件的特定地点,被当做注释。便...
    99+
    2023-01-31
    字符串 Python
  • php字符串如何替换第一个字符后面的字符
    本文小编为大家详细介绍“php字符串如何替换第一个字符后面的字符”,内容详细,步骤清晰,细节处理妥当,希望这篇“php字符串如何替换第一个字符后面的字符”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。php中可用s...
    99+
    2023-06-30
  • JavaScript中字符串的常用方法总结
    目录1.字符串长度2.查找字符串中的位置indexOf()lastIndexOf()search()3.提取部分字符串slice()substring()subst ...
    99+
    2022-12-08
    JavaScript字符串常用方法 JavaScript字符串方法 JavaScript字符串
  • 利用Rust编写一个简单的字符串时钟
    目录1、简介2、用到的知识点2.1 取utc时间2.2 图片变换为像素图案2.3 字符方式显示当前时间2.4 时间刷新1、简介 用rust写的一个简单的练手的demo,一个字符串时钟...
    99+
    2022-12-26
    Rust字符串时钟 Rust 时钟
  • PHP返回一个字符串在另一个字符串中开始位置到结束位置的字符串
    这篇文章将为大家详细讲解有关PHP返回一个字符串在另一个字符串中开始位置到结束位置的字符串,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 PHP 中使用 substr() 函数从字符串中提取子字符串 s...
    99+
    2024-04-02
  • 31个必备的Python字符串方法总结
    目录1、Slicing2、strip()3、lstrip()4、rstrip()5、removeprefix()6、removesuffix()7、replace()8、re.sub...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作