rust 在声明性宏迭代中有什么方法可以“提前返回”吗?

ubof19bj  于 2023-03-02  发布在  其他
关注(0)|答案(1)|浏览(115)

我对拉斯特的宏不熟悉。
我想找到一种方法来实现这样的行为:early return in iterations
我了解到可以使用声明性宏生成元组,如下所示:

fn function(input) -> Result<input_type,err_type> {
    // do something
}

macro_rules! to_tuple {
    ($($input:expr),*) => (($( function($input), )*));
}

fn main() {
    to_tuple!(i_1, i_2);
    // I will get a tuple: (o_1, o_2)
}

现在我想在每次迭代中检查function的结果。如果它们都正常,我将得到Ok(tuple)。如果出现错误,我将得到Err(stirng)。例如:

to_tuple!(right_1, right_2) => Ok( (o_1, o_2) )
to_tuple!(right_1, right_2, right_3) => Ok( (o_1, o_2, o_3) )
to_tuple!(right_1, wrong_1, right_2) => Err( string )

使用声明性宏可以做到这一点吗?
我认为宏产生的不是真实的的迭代,所以没有迭代,因此显然没有“早回”。我希望我错了。如果有人有任何想法,请告诉我。

aoyhnmkz

aoyhnmkz1#

这将是try blocks的完美之处,只是它们不稳定,但我们可以用闭包来模拟它们:

macro_rules! to_tuple {
    ($($input:expr),*) => ((|| -> Result<_, String> { Ok(($( function($input)?, )*)) })());
}

相关问题