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

时间:2016-11-09 14:31:13

标签: macros rust

使用一个突破循环的宏可以工作,但我想传入一个标签,以便能够定义哪个外部循环突破。

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

my_macro({ break 'outer; });

有没有办法通过:

my_macro('outer);

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

1 个答案:

答案 0 :(得分:6)

将其作为多功能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");
}

Playground

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