Rust 除了新的关键字外,原始标识符的用例是什么?
与2018年一样,我们现在有: 此功能之所以有用,有几个原因,但主要原因是版本间的情况。例如,Rust 除了新的关键字外,原始标识符的用例是什么?,rust,rust-2018,Rust,Rust 2018,与2018年一样,我们现在有: 此功能之所以有用,有几个原因,但主要原因是版本间的情况。例如,try在2015版中不是关键词,但在2018版中是关键词。因此,如果您有一个用Rust 2015编写的库,并且有一个try函数,要在Rust 2018中调用它,您需要使用原始标识符 除了上面提到的,还有其他的优势吗?是否计划将关键字设置为上下文,例如,您可以使用类型作为变量的标识符?为什么我应该使用像r#type这样的晦涩语法,而不是ty或其他什么?与原始标识符相关,您可以使用type和其他关键字作为变
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:嗯,我想有时候你可能只是需要那个特定的词来更清楚:)。这也可能为该语言的更自由的关键字策略铺平道路。