在Rust中,可以编写do-while风格的循环:
请注意,使用do-while形式而不是
这样做是可行的,但当逻辑被封装在宏中时,当使用
这在基本情况下可以工作:
但是这可能会进入一个无限循环,乍一看并不是很明显:
在Rust中编写支持使用
loop {
something();
if !test() {
break;
}
}
请注意,使用do-while形式而不是
while test() { something() }
的目的是,test()
可能需要在something()
之后运行。这样做是可行的,但当逻辑被封装在宏中时,当使用
continue
时会更加难以理解。它将跳过测试,有可能进入无限循环:macro_rules! loop_over_items {
($item:expr, $iter:ident, $code:block) => {
{
let first = $item.first;
let mut $iter = first;
loop {
$code
$iter = $iter.next;
if (first != $iter) {
break;
}
}
}
}
}
这在基本情况下可以工作:
loop_over_items!(item, iter_elem, {
code_to_run;
});
但是这可能会进入一个无限循环,乍一看并不是很明显:
loop_over_items!(item, iter_elem, {
if some_test() {
continue;
}
code_to_run;
});
在Rust中编写支持使用
continue
跳过$code
后面逻辑的宏,您可以采用什么方法?