首页 > 解决方案 > 循环局部变量

问题描述

在 Rust 中,我有没有更简洁的方法来写这个?

for i in [&mut foo, &mut bar, &mut baz, &mut quux, &mut bob].iter_mut() {
    i.handle_event(event)
}

上面的循环出现在我的函数的三个地方。foobar都是相同类型的可变局部变量。

let mut foo = MyType::new(...);
let mut bar = MyType::new(...);
...

我不想写let mut v = vec![foo, bar, baz, quuz, bob],因为向量会消耗变量。我还需要写诸如此类的bar.set_strength(10)东西,而我不想写v[1].set_strength(10);如果我可以按名称引用每个代码,则代码会更清晰。

标签: rust

解决方案


我不确定这是否更清洁,但这是使用宏执行此操作的一种方法:

操场

macro_rules! mut_loop {
    ($i:pat in [$($var:ident),*] $block:block) => {
        for _mut_loop_var in [$(&mut $var),*].iter_mut() {
            let $i = &mut **_mut_loop_var;
            $block;
        }
    }
}

fn main() {
    let mut foo = 0u32;
    let mut bar = 0;
    let mut baz = 0;
    let mut quux = 0;
    let mut bob = 0;
    mut_loop!(i in [foo, bar, baz, quux, bob] {
        *i += 5;
        // i.handle_event(event)
    });
}

推荐阅读