You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust声明式宏中实现带提前返回的Result元组生成?

实现带提前返回的Result元组生成声明式宏

可以通过递归式声明式宏实现这个需求,核心思路是逐个处理输入元素,每次调用function后检查结果:若为Err则直接返回;若为Ok则将值加入累积的元组,继续处理下一个元素。以下是具体实现:

完整代码示例

fn function(input: i32) -> Result<i32, &'static str> {
    if input > 0 {
        Ok(input * 2)
    } else {
        Err("negative number")
    }
}

// 主宏:转发输入到辅助累积宏
macro_rules! to_tuple {
    ($($input:expr),*) => {
        __to_tuple_acc__(() $($input),*)
    };
}

// 辅助累积宏:递归处理元素并构建元组
macro_rules! __to_tuple_acc__ {
    // 终止模式:所有元素处理完成,返回Ok包裹的最终元组
    (($($acc:expr),*)) => {
        Ok(($($acc),*))
    };
    // 递归模式:处理下一个元素,累积Ok值或提前返回Err
    (($($acc:expr),*), $next:expr, $($rest:expr),*) => {
        match function($next) {
            Ok(next_val) => __to_tuple_acc__(($($acc,)* next_val) $($rest),*),
            Err(e) => Err(e),
        }
    };
}

fn main() {
    // 全Ok的情况:返回Ok((2, 4, 6))
    let res_ok = to_tuple!(1, 2, 3);
    println!("{:?}", res_ok);

    // 含Err的情况:提前返回Err("negative number"),不会处理后续的3
    let res_err = to_tuple!(1, -2, 3);
    println!("{:?}", res_err);
}

工作原理

  1. 主宏to_tuple!:将输入参数转发给辅助宏__to_tuple_acc__,初始累积元组设为空元组()。
  2. 辅助宏的递归逻辑:
    • 当没有剩余元素时,返回Ok(累积元组),完成流程。
    • 当有剩余元素时,先调用function($next):
      • 若返回Ok(next_val),则将该值加入累积元组,递归处理剩下的元素。
      • 若返回Err(e),则直接返回Err(e),终止后续所有元素的处理,实现"提前返回"的效果。

这种方式利用声明式宏的模式匹配递归特性,模拟了迭代的逐个处理逻辑,同时满足遇到错误立即返回的需求。

内容的提问来源于stack exchange,提问作者cyvb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:53:22