gpt4 book ai didi

RuSTLang : Adding a return statement in a macro

转载 作者:行者123 更新时间:2023-12-03 11:28:29 25 4
gpt4 key购买 nike

我正在学习 ruSTLings 类(class)以学习 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关键词。在这种情况下,编译器会输出一整套错误和警告。
为什么这不正确? rust 宏中是否不允许使用 return 语句?

最佳答案

当你调用一个宏时,它的主体被粘贴*到它被调用的地方。
这意味着在第二个片段中,这个:

#[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这也可以防止命名冲突。

关于RuSTLang : Adding a return statement in a macro,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64923038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com