如何在rust中创建匹配宏?

如何在rust中创建匹配宏?,rust,rust-macros,Rust,Rust Macros,我正在尝试完成沙沙声练习中的第4个小测验: //编写一个通过测验的宏!这次没有提示,你可以做到 #[cfg(test)] mod tests { use super::*; #[test] fn test_my_macro_world() { assert_eq!(my_macro!("world!"), "Hello world!"); } #[test] fn test_my_macr

我正在尝试完成沙沙声练习中的第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!");
    }
}
我的宏如下所示:

#[macro_export]
macro_rules! my_macro {
    (($val:expr), "world!") => {
        println!("Hello world!");
    };
    (($val:expr), "goodbye!") => {
        println!("Hello goodbye!");
    };
}
这是在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

我找不到解决这个问题的方法来编译它。救命啊

在头脑清醒并彻底检查错误消息后,我发现了它。以下是解决方案:

#[macro_export]
macro_rules! my_macro {
    ($("world!"),*) => {
        "Hello world!"
    };
    ($("goodbye!"),*) => {
        "Hello goodbye!"
    };
}

#[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!");
    }
}

我把它弄得太复杂了。

在头脑清醒并彻底检查了错误消息后,我发现了它。以下是解决方案:

#[macro_export]
macro_rules! my_macro {
    ($("world!"),*) => {
        "Hello world!"
    };
    ($("goodbye!"),*) => {
        "Hello goodbye!"
    };
}

#[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!");
    }
}

我把它弄得太复杂了。

我认为这个练习的目的是找到一种方法,通过使用宏,我们可以得到字符串“Hello where”。我也是Rust的新手,但我可以这样做:

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

我在等待反馈

我认为这个练习的目的是找到一种方法,通过使用宏,我们可以得到字符串“Hello where”。我也是Rust的新手,但我可以这样做:

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

我在等待反馈

您不应该使用
格式!()
在@Max的答案中这样的宏中,应该使用
concat,因为它在编译时生成字符串片段,而不是在运行时格式化:

macro\u规则!my_宏{
($val:tt)=>{
concat!(“你好,$val”);
}
}

您不应该使用
格式!()
在@Max的答案中这样的宏中,应该使用
concat,因为它在编译时生成字符串片段,而不是在运行时格式化:

macro\u规则!my_宏{
($val:tt)=>{
concat!(“你好,$val”);
}
}

试着手工编写宏的扩展,看看是否对您有意义。宏中的
($val:expr),
是什么?它没有使用,您希望它与什么匹配?尝试手动编写宏的扩展,看看它是否对您有意义。宏中的
($val:expr),
是什么?它没有被使用,你希望它能匹配什么?这样它可以工作,但也有点太复杂了。提示:1)
$(something),*
构造在您的案例中起什么作用?2) 分支之间有什么区别?3) 你知道吗?这种方法很有效,但也有点太复杂了。提示:1)
$(something),*
构造在您的案例中起什么作用?2) 分支之间有什么区别?3) 你知道吗?