Почему я должен использовать загадочный синтаксис, такой как r#type
вместо ty
или что-то еще?
Иногда имена полей используются вне вашей программы Rust. Например, при сериализации данных с помощью Serde в выходных данных используется имя поля (например, JSON).Так что если вам нужен вывод JSON с этим:
"type": 27,
..., то необработанные идентификаторы могут вам помочь:
#[derive(Serialize)]
struct Foo {
r#type: u32,
}
С другой стороны ... У Серде уже есть способдобиться того, что вы хотите: атрибут #[serde(rename = "name")]
.Зарезервированные ключевые слова Rust являются одной из причин, по которой этот атрибут был введен.
#[derive(Serialize)]
struct Foo {
#[serde(rename = "type")]
ty: u32,
}
Аналогично, вывод Debug
также использует имя поля в своих выходных данных.Поэтому, если вам нужен вывод Foo { type: 27 }
, вы можете использовать необработанные идентификаторы:
#[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 из другого издания» является единственным реальным вариантом использования необработанных идентификаторов. Наличие такого синтаксиса «только для случая»хорошая вещь, хотя.