如何在Rust中将命名循环标签传递给宏

  • 本文关键字:标签 循环 Rust macros rust
  • 更新时间 :
  • 英文 :


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

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

my_macro({ break 'outer; });

有没有办法通过:

my_macro('outer);

…可以在宏中写成break $my_label;,展开成break 'outer; ?

将其作为通用的tt(令牌树)传递:

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");
}
游乐场

对于未来的读者,有一个公认的RFC为宏参数添加了生命周期说明符。

最新更新