Как вернуть новую строку из декларативного макроса?
Так что я здесь, грузовик вместе с 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)
}
}