Rustlang:在宏中添加 return 语句

Rustlang: Adding a return statement in a macro

我正在学习 rustlings 课程以学习 rustlang,我正在做测验 4。以下是我找到的解决方案。

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

#[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_rules! my_macro {
    ($val:expr) => {
       return format!("Hello {}", $val)
    }
}

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

此无效解决方案的唯一区别是 return 关键字。在这种情况下,编译器会吐出一整套错误和警告。

为什么这不正确? return 语句是否不允许来自 rust 宏?

当您调用宏时,它的主体会粘贴*到调用它的地方。

这意味着在第二个片段中,这个:

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

扩展为:

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

导致类型错误。


* 比这要复杂一些:还有一些 magic 也可以防止命名冲突。