Rust中的三大【原始raw】项rust中三大条件处理】的文章。最近梳理代码,我又偶然发现另一组“三大”。即,三大·原始raw项。它们包括:Raw String LiteralString LiteralRaw Byte String LiteralByte String LiteralRaw IdentifierItems的概念并不复杂。我就是感觉·这接连出现的两组“三大”挺有意思。所以,和大家分享一下。此外,我也不确定是否还会遇见第三组与第四组...Raw String Literal和Raw Byte String Literal)的共同特点是:批量转义·字符串·字面量·内的特殊字符”。从而,避免充斥着许多转义符\的大段字符串,和提高代码的可读性。或许,将这两项·类比为ECMAScript 6中的【模板·字符串】撇号语法会更容易理解些(它们的主要功能极为接近)。Raw Byte String Literal就是<原始 ASCII 字符串·字面量>.as_bytes()的语法糖 [例程1]。展开来讲,ASCII字符作为内容,因为它要·以从char至byte一一对应的方式·将字符串转变成&[u8]。String给误导了,【原始·字节·字符串·字面量】是不认识UTF-8编码格式的,更不一定是有效的UTF-8字节序列。因此,可别惦记“汉字”字面量呀!Raw Identifier是为了兼容性而生,和什么转义可没有半毛钱关系。具体地讲,它允许·依托于最新版次rustc的Cargo Package工程导入满足以下特点的“老古董”crate作为依赖项:rustc编译器成功。比如,rust toolchain 2015。pub函数或变量名·与·新版次rustc引入的保留·关键字·相冲突。比如,来自rust 2018的try关键字。Raw String LiteralString Literal】,Raw String Literal仅能转义【换行符】与【缩进】[例程2]。而String Literal还能转义\x为前缀的·代表任意字符的·十六进制数字 [例程3]\u{十六进制数字}格式的·代表任意字符的·Unicode码 [例程4]Raw String Literal套路就是:左右两侧的 #符可以被无限增加下去,直至由多个#与单个"构成的字符组合不会出现于字符串字面量里为止。
r"<没有包含·双引号·的字符串>"r#"<包含了", 但没有包含#"和"#的字符串>"#r##"<包含了#"或"#,但没有包含##"和"##的字符串>"##r###"<包含了##"或"##,但没有包含###"和"###的字符串>"###Raw Byte String LiteralByte String Literal】,Raw Byte String Literal仅能转义【换行符】与【缩进】[例程5]。而Byte String Literal还能转义\x为前缀的·代表任意字符的·十六进制数字 [例程6]Raw Byte String Literal套路就是:左右两侧的 #符可以被无限增加下去,直至由多个#与单个"构成的字符组合不会出现于字符串字面量里为止。
br"<没有包含·双引号·的字符串>"br#"<包含了", 但没有包含#"和"#的字符串>"#br##"<包含了#"或"#,但没有包含##"和"##的字符串>"##br###"<包含了##"或"##,但没有包含###"和"###的字符串>"###Raw IdentifierRaw Identifierr#<Identifier>extern crate foo; // 只有`rustc 2015`才能成功编译依赖项`foo crate`fn main() { // `Cargo Package`采用的编译环境是`rustc 2021`
foo::r#try(); // `foo crate`的导出函数`foo::try()`名与`rustc 2018`的新关键字`try`冲突了。}
原文作者:Rust语言中文社区;如有侵权,请联系管理员删除。