Можно ли сохранить состояние в процедурных макросах Rust? - PullRequest
0 голосов
/ 21 октября 2018

Возможно ли создать макрос, который ничего не выводит, а вместо этого сохраняет состояние для создания списка, а затем второй макрос, который затем фактически использует эти данные?

Например:

trait SomeTrait {}

#[derive(mark)]
struct Person {}

impl SomeTrait for Person {}

#[derive(mark)]
struct Item {}

impl SomeTrait for Item  {}

#[derive(mark)]
struct Object {}

impl SomeTrait for Object {}

create_mapper! // this then outputs the below function
//assuming for the fact that data is loaded correctly before this macro is used

fn select_item(kind: String) -> impl SomeTrait {
    match kind {
        "person" => Person,
        "item" => Item,
        "object" => Object,        
    }
}

1 Ответ

0 голосов
/ 21 октября 2018

В настоящее время не существует официально поддерживаемого способа хранения состояния, который может использоваться двумя различными вызовами макросов proc.Я создал эту очень связанную проблему , где обсуждается эта проблема.

Сохранение состояния, конечно, возможно, но просто хакерским способом.Вы можете, например, сериализовать все ваше состояние в /tmp/my-state.Или вы можете попробовать использовать static глобальные переменные.Но даже если это работает сейчас, это не гарантированно сработает в будущем.Другая проблема: из-за инкрементной компиляции не гарантируется, что все ваши макропроцессы proc будут фактически выполнены.Поэтому, если у вас есть один макрос, который генерирует состояние, и тот, который читает его, если первый не выполняется, происходят действительно странные вещи.Таким образом, технически возможно сохранить глобальное состояние, но это не рекомендуется.

В проблеме, указанной выше, вы можете видеть, что MSleepyPanda предложила возможное решение , но мы далеки от того, чтобы иметь этореализован.

...