Как вернуть новую строку из декларативного макроса?

Так что я здесь, грузовик вместе с Rustlings, пока я не получу широкую поддержку с тестом 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 ответ

Решение

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

macro_rules! my_macro {
    ($val:expr) => {
        format!("Hello {}", $val)
    }
}
Другие вопросы по тегам