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

Rust遍历数组检查子对象文本存在的问题(Shopify支付定制场景)

Shopify支付扩展:判断配送选项标题的Rust实现方案

问题核心

遍历cart.deliveryGroups,检查是否存在任意一个配送组的selectedDeliveryOption的title等于"Test",存在返回true,否则返回false。

错误原因

你用到的option_result_contains是Rust的不稳定特性,对应Option::contains或Result::contains这类未稳定的方法,稳定版Rust环境下无法编译。

正确的稳定迭代实现

先假设你的数据结构与Shopify支付扩展的常见结构匹配(需对齐你的实际定义):

#[derive(Debug)]
struct Cart {
    delivery_groups: Vec<DeliveryGroup>,
}

#[derive(Debug)]
struct DeliveryGroup {
    selected_delivery_option: Option<DeliveryOption>,
}

#[derive(Debug)]
struct DeliveryOption {
    title: String,
}

标准写法(短路求值,效率最优)

fn has_test_delivery_option(cart: &Cart) -> bool {
    cart.delivery_groups.iter().any(|group| {
        group.selected_delivery_option.as_ref().map_or(false, |option| {
            option.title == "Test"
        })
    })
}

关键细节

  • iter().any():遍历过程中只要找到符合条件的项就立即返回,避免不必要的遍历。
  • as_ref():获取Option的引用,避免转移所有权导致的编译错误。
  • map_or(false, ...):处理None的情况(无选中配送选项时返回false),Some时检查标题是否匹配。

替代实现方式

模式匹配写法(更直观)

fn has_test_delivery_option(cart: &Cart) -> bool {
    cart.delivery_groups.iter().any(|group| {
        match &group.selected_delivery_option {
            Some(option) => option.title == "Test",
            None => false,
        }
    })
}

链式调用写法(简洁易读)

fn has_test_delivery_option(cart: &Cart) -> bool {
    cart.delivery_groups
        .iter()
        .filter_map(|group| group.selected_delivery_option.as_ref())
        .any(|option| option.title == "Test")
}
  • filter_map:自动过滤掉None的配送选项,只保留有效选项的引用,再通过any检查标题。

调试技巧

如果仍有问题,可打印配送组的详细信息排查:

fn debug_delivery_options(cart: &Cart) {
    for (idx, group) in cart.delivery_groups.iter().enumerate() {
        println!("配送组 {}: {:?}", idx, group.selected_delivery_option);
    }
}

调用该函数可确认selectedDeliveryOption是否存在,以及title的实际值是否符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:51:35