Каковы варианты использования необработанных идентификаторов помимо новых ключевых слов? - PullRequest
0 голосов
/ 23 июня 2018

Как и в Rust 2018, теперь у нас есть необработанные идентификаторы :

Эта функция полезна по нескольким причинам, но основной мотивацией были ситуации между изданиями. Например, try - это не ключевое слово в выпуске 2015 года, а в выпуске 2018 года. Поэтому, если у вас есть библиотека, написанная на Rust 2015 и имеющая функцию try, для вызова ее в Rust 2018 вам нужно будет использовать необработанный идентификатор.

Есть ли другие преимущества, кроме указанных выше? Есть ли планы сделать ключевые слова контекстными, например, Вы можете использовать type в качестве идентификатора для переменных? Почему я должен использовать загадочный синтаксис, такой как r#type вместо ty или что-то еще?

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

Почему я должен использовать загадочный синтаксис, такой как 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 из другого издания» является единственным реальным вариантом использования необработанных идентификаторов. Наличие такого синтаксиса «только для случая»хорошая вещь, хотя.

0 голосов
/ 23 июня 2018

Введя raw_identifiers, вы можете использовать type и другие ключевые слова в качестве переменной / struct / etc. идентификаторы:

#![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`
}

Это не работает с каждым ключевым словом, однако:

let r#super = 0; // error: `r#super` is not currently supported.
...