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 也可以防止命名冲突。
我正在学习 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 也可以防止命名冲突。