< 返回我的博客

爱国的张浩予 发表于 2022-07-08 07:06

Tags:raw-string-literal,raw-byte-string-literal,raw-identifier

Rust中的三大【原始raw】项

引言

我早先写过一篇【rust中三大条件处理】的文章。最近梳理代码,我又偶然发现另一组“三大”。即,三大·原始raw项。它们包括:

  • 原始·字符串·字面量Raw String Literal
    • 对应于:字符串·字面量String Literal
  • 原始·字节·字符串·字面量Raw Byte String Literal
    • 对应于:字节·字符串·字面量Byte String Literal
  • 原始·识别符Raw Identifier
    • 馁馁的孤例,没有对应了。

这三“大”项Items的概念并不复杂。我就是感觉·这接连出现的两组“三大”挺有意思。所以,和大家分享一下。此外,我也不确定是否还会遇见第三组与第四组...

概述

  • 首先,前两项(Raw String LiteralRaw Byte String Literal)的共同特点是:批量转义·字符串·字面量·内的特殊字符”。从而,避免充斥着许多转义符\的大段字符串,和提高代码的可读性。或许,将这两项·类比为ECMAScript 6中的【模板·字符串】撇号语法会更容易理解些(它们的主要功能极为接近)。
  • 其次,Raw Byte String Literal就是<原始 ASCII 字符串·字面量>.as_bytes()的语法糖 [例程1]。展开来讲,
    • 【原始·字节·字符串·字面量】仅只接受ASCII字符作为内容,因为它要·以从charbyte一一对应的方式·将字符串转变成&[u8]
    • 千万别被它名字内的String给误导了,【原始·字节·字符串·字面量】是不认识UTF-8编码格式的,更不一定是有效的UTF-8字节序列。因此,可别惦记“汉字”字面量呀!
  • 最后,Raw Identifier是为了兼容性而生,和什么转义可没有半毛钱关系。具体地讲,它允许·依托于最新版次rustcCargo Package工程导入满足以下特点的“老古董crate作为依赖项:
    • 仅能由低版次rustc编译器成功。比如,rust toolchain 2015
    • 其导出的pub函数或变量名·与·新版次rustc引入的保留·关键字·相冲突。比如,来自rust 2018try关键字。

原始·字符串·字面量Raw String Literal

  • 相对于【字符串·字面量String Literal】,Raw String Literal仅能转义【换行符】与【缩进】[例程2]。而String Literal还能转义

    • \x为前缀的·代表任意字符的·十六进制数字 [例程3]
    • 匹配\u{十六进制数字}格式的·代表任意字符的·Unicode[例程4]
  • 标识Raw String Literal

    • r"<没有包含·双引号·的字符串>"
    • r#"<包含了", 但没有包含#""#的字符串>"#
    • r##"<包含了#""#,但没有包含##""##的字符串>"##
    • r###"<包含了##""##,但没有包含###""###的字符串>"###

    套路就是: 左右两侧的#符可以被无限增加下去,直至由多个#与单个"构成的字符组合不会出现于字符串字面量里为止。

原始·字节·字符串·字面量Raw Byte String Literal

  • 相对于【字节·字符串·字面量Byte String Literal】,Raw Byte String Literal仅能转义【换行符】与【缩进】[例程5]。而Byte String Literal还能转义

    • \x为前缀的·代表任意字符的·十六进制数字 [例程6]
  • 标识Raw Byte String Literal

    • br"<没有包含·双引号·的字符串>"
    • br#"<包含了", 但没有包含#""#的字符串>"#
    • br##"<包含了#""#,但没有包含##""##的字符串>"##
    • br###"<包含了##""##,但没有包含###""###的字符串>"###

    套路就是: 左右两侧的#符可以被无限增加下去,直至由多个#与单个"构成的字符组合不会出现于字符串字面量里为止。

原始·识别符Raw Identifier

  • 馁馁的孤例,没有可做对比的。

  • 标识Raw Identifier

    • r#<Identifier>
  • 一个用例,请重点看代码注释。

    extern crate foo; // 只有`rustc 2015`才能成功编译依赖项`foo crate`
    fn main() { // `Cargo Package`采用的编译环境是`rustc 2021`
        foo::r#try(); // `foo crate`的导出函数`foo::try()`名与`rustc 2018`的新关键字`try`冲突了。
    }
    

结束语

这次要分享的就是这些。其实,我对【原始·字符串·字面量】的使用率还是比较高,但对其它两项也就蹭了个概念熟。

评论区

写评论
作者 爱国的张浩予 2022-07-08 12:18

我在文章里提的三个raw都是语法层面的(比较简单)。您的问题涉及到了【原始·指针】。这方面,我不太熟悉。

--
👇
ManonLoki: Raw在FFI交互的时候十分常用,Vec也用,但是我没办法正常使用raw还原一个数组,这里向大佬请教下

ManonLoki 2022-07-08 09:55

Raw在FFI交互的时候十分常用,Vec也用,但是我没办法正常使用raw还原一个数组,这里向大佬请教下

1 共 2 条评论, 1 页