Возможно ли для макроса превратить идентификатор в нижний регистр? - PullRequest
0 голосов
/ 05 сентября 2018

Можно ли сгенерировать символ или идентификатор в макросе Rust из строки? Или выполнять строковые операции с идентификатором?

Я хотел сгенерировать метод с заданным символом, но нужно уменьшить его до получить имя метода.

get!(B);

// should expand to

fn b() -> B {
    // method body
}

Близко подобраться ...

macro_rules! get {
    ($kind:ident, $method:ident)
        =>
    {
        fn $method() -> $kind {
           // method body
        }
    }
}

get!(B, b)

Но недоволен.

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Я только что написал процедурный макрос ( casey ) для этого.

#![feature(proc_macro_hygiene)]

use casey::lower;

lower!(B); // would render as `b`

0 голосов
/ 05 сентября 2018

Нет, нет макроса, который мог бы выполнять такого рода строковые манипуляции с идентификаторами.

Можно создать такой макрос в компиляторе, но это не является популярной необходимостью; сегодня только экспериментальный concat_idents! подходит к этому близко (то есть строковые операции для идентификаторов).

Ваш обходной путь в настоящее время является единственным доступным решением.

...