Как вернуть новую строку из декларативного макроса? - PullRequest
0 голосов
/ 28 февраля 2019

Так что я здесь, продолжая грузиться вместе с Растлингсом, пока я не получу в общих чертах тест 4.

Он хочет, чтобы я написал макрос, который будет удовлетворять следующему коду:

fn main() {
    if my_macro!("world!") != "Hello world!" {
        panic!("Oh no! Wrong output!");
    }
}

Итак, я написал это:

macro_rules! my_macro {
    ($val:expr) => {
        println!("Hello {}", $val);
    }
}

И Рустлингс выплюнул это:

error[E0308]: mismatched types
  --> exercises/test4.rs:15:31
   |
15 |     if my_macro!("world!") != "Hello world!" {
   |                               ^^^^^^^^^^^^^^ expected (), found reference
   |
   = note: expected type `()`
              found type `&'static str`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.

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

1 Ответ

0 голосов
/ 28 февраля 2019

println! будет напечатано в stdout.Вместо этого вы просто хотите отформатировать строку и вернуть ее из макроса.Вместо этого используйте format! и отбросьте ;, чтобы оно вернуло выражение вместо ():

macro_rules! my_macro {
    ($val:expr) => {
        format!("Hello {}", $val)
    }
}
...