Rust 除了新的关键字外,原始标识符的用例是什么?

Rust 除了新的关键字外,原始标识符的用例是什么?,rust,rust-2018,Rust,Rust 2018,与2018年一样,我们现在有: 此功能之所以有用,有几个原因,但主要原因是版本间的情况。例如,try在2015版中不是关键词,但在2018版中是关键词。因此,如果您有一个用Rust 2015编写的库,并且有一个try函数,要在Rust 2018中调用它,您需要使用原始标识符 除了上面提到的,还有其他的优势吗?是否计划将关键字设置为上下文,例如,您可以使用类型作为变量的标识符?为什么我应该使用像r#type这样的晦涩语法,而不是ty或其他什么?与原始标识符相关,您可以使用type和其他关键字作为变

与2018年一样,我们现在有:

此功能之所以有用,有几个原因,但主要原因是版本间的情况。例如,
try
在2015版中不是关键词,但在2018版中是关键词。因此,如果您有一个用Rust 2015编写的库,并且有一个
try
函数,要在Rust 2018中调用它,您需要使用原始标识符


除了上面提到的,还有其他的优势吗?是否计划将关键字设置为上下文,例如,您可以使用
类型
作为变量的标识符?为什么我应该使用像
r#type
这样的晦涩语法,而不是
ty
或其他什么?

原始标识符相关,您可以使用
type
和其他关键字作为变量/结构等。标识符:

#![feature(rust_2018_preview)]
#![feature(raw_identifiers)]

struct r#let {} // just warnings: struct is never used: `let` and type `let` should have a camel case name such as `Let`

fn main() {
    let r#type = 0; // just warning: unused variable: `type`
}
#[derive(Debug)]
struct Foo {
    r#type: u32,
}
但它并不适用于所有关键字:

let r#super = 0; // error: `r#super` is not currently supported.
为什么我应该使用像
r#type
这样的晦涩语法,而不是
ty
或其他什么

有时,字段名会在Rust程序之外使用。例如,当使用Serde序列化数据时,字段名会在输出中使用(例如JSON)。因此,如果您需要JSON输出:

"type": 27,
。。。然后,原始标识符可以帮助您:

#[derive(Serialize)]
struct Foo {
    r#type: u32,
}
另一方面。。。Serde已经有了实现您所需的方法:。保留的Rust关键字是引入此属性的原因之一

#[derive(Serialize)]
struct Foo {
    #[serde(rename = "type")]
    ty: u32,
}

类似地,
Debug
输出也在其输出中使用字段名。因此,如果想要输出
Foo{type:27}
,可以使用原始标识符:

#![feature(rust_2018_preview)]
#![feature(raw_identifiers)]

struct r#let {} // just warnings: struct is never used: `let` and type `let` should have a camel case name such as `Let`

fn main() {
    let r#type = 0; // just warning: unused variable: `type`
}
#[derive(Debug)]
struct Foo {
    r#type: u32,
}
另一方面。。。如果确切的
Debug
输出对您非常重要,您只需自己实现即可:

impl fmt::Debug for Foo {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        f.debug_struct("Foo")
            .field("type", &self.ty)
            .finish()
    }
}

所以在实践中,我不明白为什么要使用原始标识符来实现这一目的,因为在使用该名称的任何地方都必须使用奇怪的
r#
语法。用另一种方法解决这个问题可能更容易


因此,在我看来,“使用另一个版本的API”是原始标识符的唯一真正用例。有这样一个语法“仅用于该用例”是一件好事。

对不起,我想,我没有充分指出这一点。为什么我应该使用晦涩的语法
r#type
,而不是仅仅使用
ty
或其他什么?将此添加到question@Tim:嗯,我想有时候你可能只是需要那个特定的词来更清楚:)。这也可能为该语言的更自由的关键字策略铺平道路。