Передайте строку stati c в macro_rule в ржавчине - PullRequest
0 голосов
/ 27 апреля 2020

Я написал следующий код:

macro_rules! my_macro{
        ("A") => {
                println!("Macro called !")
        }
}

fn main(){
        static test: &'static str = "A";
        my_macro!(test);
}

, но у меня появляется следующая ошибка:

error: no rules expected the token `test`
 --> test.rt:9:19
  |
1 | macro_rules! my_macro{
  | --------------------- when calling this macro
...
9 |         my_macro!(test);
  |                   ^^^^ no rules expected this token in macro call

error: aborting due to previous error

Тем не менее, это работает нормально, если я напрямую вызываю my_macro("A"). Можно ли это исправить?

Ответы [ 2 ]

4 голосов
/ 27 апреля 2020

Возможно ли это исправить?

Нет. Макросы раскрываются во время компиляции перед разрешением имен элементов, поэтому ваш макрос не имеет представления о значении test (и понятия не имел бы, даже если бы это было const, а не static).

0 голосов
/ 27 апреля 2020

поэтому первая проблема здесь в том, что ваш макрос ожидает шаблон «A», а не переменную, которая содержит «A»

, когда вы создаете макросы, вы определяете определенные шаблоны и следуйте этим шаблонам в вашем случае, ваш макрос всегда должен содержать «A», но это не строка a, это шаблон двойной кавычки, за которым следует заглавная буква a, а затем еще одна двойная кавычка

Если вы хотите передать значение, вы должны использовать переменный синтаксис и определите, чего следует ожидать, например, ($a:expr)=>{...}

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

PS. вот макрос, который я использую для ответа от моих конечных точек

macro_rules! resp {
    (ok) => {
        |_| actix_web::HttpResponse::Ok().body(r#"{"success":true}"#)
    };
    (ok,$data:expr) => {
        |_| actix_web::HttpResponse::Ok().json(serde_json::json!({"success":true,"data":$data}))
    };
    (ok,) => {
        |d| actix_web::HttpResponse::Ok().json(serde_json::json!({"success":true,"data":d}))
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...