如何在 Rust 中创建匹配宏?

cha*_*dge 1 rust rust-macros

我正在尝试完成 Rustlings 练习中的测验 #4:

// 编写一个通过测验的宏!这次没有提示,你可以做到!

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_my_macro_world() {
        assert_eq!(my_macro!("world!"), "Hello world!");
    }

    #[test]
    fn test_my_macro_goodbye() {
        assert_eq!(my_macro!("goodbye!"), "Hello goodbye!");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的宏看起来像这样:

#[macro_export]
macro_rules! my_macro {
    (($val:expr), "world!") => {
        println!("Hello world!");
    };
    (($val:expr), "goodbye!") => {
        println!("Hello goodbye!");
    };
}
Run Code Online (Sandbox Code Playgroud)

这是在 Rust 语言文档的声明性宏部分之后设计的。我收到以下错误:

assert_eq!(my_macro!("world!"), "Hello world!");
   |                              ^^^^^^^^^^ no rules expected this token in macro call

assert_eq!(my_macro!("goodbye!"), "Hello goodbye!");
   |                              ^^^^^^^^^^ no rules expected this token in macro call
Run Code Online (Sandbox Code Playgroud)

我找不到解决此问题的解决方案以使其编译。帮助!

小智 5

我认为,这次演习的想法是找到一种方法,通过使用宏,我们得到字符串“Hello什么”。我也是 Rust 的新手,但我已经能够以这种方式进行练习:

#[macro_use]
macro_rules! my_macro {
    ($val:expr) => {
        format!("Hello {}",$val);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在等反馈!