macros - 如何将命名循环标签传递给 Rust 中的宏?

标签 macros rust

使用跳出循环的宏是可行的,但我想传入一个标签以便能够定义要跳出哪个外部循环。

将参数作为表达式传递给语法错误,我设法让它工作的唯一方法是传递一个 block 但这不是很优雅,例如:

my_macro({ break 'outer; });

有没有办法通过:

my_macro('outer);

... 可以在宏中写为 break $my_label; 扩展为 break 'outer; ?

最佳答案

将其作为多功能 tt( token 树)工作:

macro_rules! my_break {
    ($label:tt) => { break $label; }
}

fn main() {
    'outer: loop {
        println!("Start of outer");
        loop {
            println!("Start of inner");
            my_break!('outer);
            println!("Not reachable");
        }
        println!("End of outer");
    }
    println!("End of main");
}

Playground

对于 future 的读者,有一个 accepted RFC为宏参数添加生命周期说明符。

关于macros - 如何将命名循环标签传递给 Rust 中的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40509400/

相关文章:

java - Atlassian汇合: Macro type plugin that will display a popup window when the page is accessed

C中的计算包含

c++ - 宏扩展到预处理器 block

C++ 连接 __func__ 和 const char 文字

rust - 不能将 `hsets` 借为可变,因为它也被借为不可变

rust - 为什么要尝试!()和?在不返回选项或结果的函数中使用时无法编译?

c++ - 是否可以创建这样的 C++ 宏来将您的标准(继承的)类包装到应用程序中?

csv - 使用 try 宏处理运行时 panic

visual-studio-code - 在 VSCode 中使用 Rust Cargo TOML 变量?

rust - 预期枚举 `std::result::Result` ,找到 ()